员工的多个日期范围

时间:2014-10-24 05:13:58

标签: sql sql-server sql-server-2008 tsql

我有这样的数据

id   date           ischanged
1    01-01-2014     0
1    02-01-2014     1
1    03-01-2014     1
1    04-01-2014     1
1    05-01-2014     0
1    06-01-2014     1
1    07-01-2014     0

2    01-01-2014     1
2    02-01-2014     1
2    03-01-2014     1
2    04-01-2014     0
2    05-01-2014     0
2    06-01-2014     1
2    07-01-2014     1

是否可以查询数据以根据Ischanged

从上表中获得以下结果
id   startdate     enddate
1    02-01-2014     04-01-2014
1    06-01-2014     06-01-2014
2    01-01-2014     03-01-2014
2    06-01-2014     07-01-2014

我尝试了我的查询将表连接到self并找到第一个ischanged值,但这只会给我这样的结果

id   startdate     enddate
1    02-01-2014     04-01-2014
2    01-01-2014     03-01-2014

有没有办法为同一个ID获取多个日期范围?

1 个答案:

答案 0 :(得分:1)

使用lag()函数会更容易一些,但您仍然可以在SQL Server 2008中执行此操作。

select id, min(date) as startdate, max(date) as enddate
from (select t.*,
             (row_number() over (partition by id order by date) -
              row_number() over (partition by id, ischanged order by date)
             ) as grp
      from table t 
     ) t
where ischanged = 1
group by id, grp;

请注意,这是使用两个row_number()的差异。第一个是id的所有行的序号(按日期)。第二个是id和ischanged值的单独序列号。当ischanged值是连续的时,差异是一个常数 - 它标识每个组。

外部查询只是由该组聚合。