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
你可以用 Lag() 这里也是mysql和SQLServer都支持的。 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
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
4条答案
按热度按时间pw136qt21#
您可以执行info表与自身的左联接。像这样的:
uurv41yg2#
你可以用
Lag()
这里也是mysql和SQLServer都支持的。LAG()
是一个创建记录块的“窗口函数”(PARTITION BY
)对于不同的值(这里我们使用person
). 它还对那些块/窗口/分区中的记录进行排序,并允许您对它们运行逻辑。LAG()
在有序分区内选取上一条记录的值。在这种情况下,它得到前一天的earning
对于每个记录的person
.将其放入子查询和筛选器中:
falq053o3#
给你,兄弟
eyh26e7m4#
声明@mytable table(person char,revenuing int,[workday]int)
插入@mytable(person,enwing,workday)值('a',10,2)插入@mytable(person,enwing,workday)值('a',20,3)插入@mytable(person,enwing,workday)值('b',20,1)插入@mytable(person,enwing,workday)值('a',30,4)插入@mytable(person,enwing,workday)值('b',5,2)插入@mytable(person,revenuing,workday)值('b',10,3)
选择a.个人,a.工作日作为工作日,a.收入作为前一天,b.工作日作为工作日,b.收入作为收入
从@mytable a在a.person=b.person和a.[workday]+1=b.[workday]上加入@mytable b
其中b.收入>=a.收入