表:信息
样本输出:
这是一次大学练习。我刚刚开始学习SQL,还不了解如何从列的两个不同行中选择数据并在示例输出中创建不同的列。我的尝试是完全没有用的,因此我将其放在这里,因为我只知道如何选择单独的列。
提前谢谢
答案 0 :(得分:1)
您可以自己对Info表执行LEFT JOIN。因此:
SELECT B.PERSON, B.DAY, B.EARNING, A.DAY PREVIOUS_DAY, A.EARNING PREVDAYEARNING
FROM INFO A
LEFT JOIN INFO B ON A.PERSON=B.PERSON AND B.DAY=A.DAY + 1 AND B.EARNING>=A.EARNING
WHERE B.EARNING IS NOT NULL
答案 1 :(得分:0)
您也可以在此处使用Lag()
,MySQL和SQL Server均支持。 LAG()
是一个“窗口函数”,可为不同的值(此处使用PARTITION BY
)创建大块记录(person
)。它还对这些块/窗口/分区中的记录进行排序,并允许您对它们运行逻辑。 LAG()
在该有序分区中选择上一条记录的值。在这种情况下,它将获得每个记录的earning
的前一天的person
。
SELECT person,
earning as current_day_earning,
LAG(earning) OVER (PARTITION BY person ORDER BY day) as previous_day_earning
FROM info;
在子查询和过滤器中扔掉它:
SELECT *
FROM
(
SELECT person,
earning as current_day_earning,
LAG(earning) OVER (PARTITION BY person ORDER BY day) as previous_day_earning
FROM info;
) curr_and_prev
WHERE current_day_earning > previous_day_earning
答案 2 :(得分:0)
你去这里吧
create table #temp_Data
( person varchar(1) null
, earning int null
,day int null
)
insert into #temp_Data values
('A',10,2)
,('A',20,3)
,('B',20,1)
,('B','5',2)
,('B',10,3)
,('A',30,4)
select * from (
select *
,Row_num = ROW_NUMBER() over(partition by person order by earning desc )
from #temp_Data
) a
where a.Row_num = 1
答案 3 :(得分:0)
声明@MyTable表(人员字符,收入int,[工作日] int)
插入@MyTable(person,Earning,Workday)值(“ A”,10、2) 插入@MyTable(person,Earning,Workday)值('A',20,3) 插入@MyTable(person,Earning,Workday)值(“ B”,20、1) 插入@MyTable(person,Earning,Workday)值('A',30,4) 插入@MyTable(person,Earning,Workday)值(“ B”,5、2) 插入@MyTable(person,Earning,Workday)值(“ B”,10、3)
选择 a.person,a.Workday为a_day,a.Earning为Previous_day,b.workday为b_day,b.earning为Earning
来自 @MyTable一个 在a.Person = b.person和a。[WorkDay] +1 = b。[WorkDay]上加入@MyTable b
其中b.Earning> = a.Earning