我有一个包含PersonID,TeamID和DateEffective的表。我想回到每个人改变团队的最早日期。一个人可能会回到之前分配给他们的团队。
Create Table PHistory
(PersonID INT,
TeamID VARCHAR(8),
DateEffective datetime)
Insert INTO PHistory
Values (1, 'TeamA', '2017-07-01'),
(1, 'TeamA', '2017-07-02'),
(1, 'TeamB', '2017-07-03'),
(1, 'TeamA', '2017-07-04'),
(2, 'TeamA', '2017-07-01'),
(2, 'TeamA', '2017-07-02'),
(2, 'TeamA', '2017-07-03'),
(2, 'TeamA', '2017-07-04')
我想要返回的查询:
我已经搞砸了MIN(),但它没有应对人们可以回到老队伍的事实。
我见过使用窗口函数的this post,但它只返回最新的记录,我需要看到所有团队的变化(我看不出如何根据我的需要调整它)。
答案 0 :(得分:1)
以下是使用row_number
select
PersonId, minDate = min(DateEffective)
from (
select
*, rn1 = row_number() over (partition by PersonId order by DateEffective)
, rn2 = row_number() over (partition by PersonId, TeamId order by DateEffective)
from
PHistory
) t
group by PersonId, rn1 - rn2
order by 1,2
输出
1 2017-07-01 00:00:00.000
1 2017-07-03 00:00:00.000
1 2017-07-04 00:00:00.000
2 2017-07-01 00:00:00.000