返回值更改的每个日期

时间:2018-02-16 16:19:41

标签: sql-server sql-server-2012

我有一个包含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')

我想要返回的查询:

  • 1 | 'TeamA' | 2017年7月1日
  • 1 | 'TeamB' | 2017年7月3日
  • 1 | 'TeamA' | 2017年7月4日
  • 2 | 'TeamA' | 2017年7月1日

我已经搞砸了MIN(),但它没有应对人们可以回到老队伍的事实。

我见过使用窗口函数的this post,但它只返回最新的记录,我需要看到所有团队的变化(我看不出如何根据我的需要调整它)。

1 个答案:

答案 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