我有这样的数据
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获取多个日期范围?
答案 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
值是连续的时,差异是一个常数 - 它标识每个组。
外部查询只是由该组聚合。