0

У меня есть ниже таблицы с данныминесколько диапазонов дат на основе битового значения

id departmentid ischanged date 
3 22    0  2014-01-04 
3 101   0  2014-01-05 
3 125   1  2014-01-06 
3 169   1  2014-01-07 
3 175   0  2014-01-08 
3 176   0  2014-01-09 
3 177   0  2014-01-10 

5 22    0  2014-01-04 
5 101   0  2014-01-05 
5 125   0  2014-01-06 
5 169   0  2014-01-07 
5 175   0  2014-01-08 
5 176   0  2014-01-09 
5 177   0  2014-01-10 

и мой текущий запрос

insert into #temp1(id, startdate, enddate) 
SELECT t1.id, '2014-1-4' as startdate, min(isnull(enddate,'2014-01-10')) as endDate 
FROM (
      SELECT id, departmentid, ischanged 
      FROM dbo.[table] where date = '2014-1-4' 
    ) AS t1 
     left join 
     (
      SELECT id, departmentid, ischange , date 
      FROM dbo.[table] where date >= '2014-1-4' 
     ) as t2 
     on t1.id = t2.id and (t1.ischange <> t2.ischange) 
group by t1.id 

и приведет к следующему выходу, если ischange не изменяется то он будет захватывать дату окончания жесткого кодирования из запроса, в противном случае он получит наименьшее значение ischange, измененное значение

id startdate  enddate 
3 2014-01-04 2014-01-05 
5 2014-01-04 2014-01-10 

, но я нуждаюсь в наборе результатов, как этот

id startdate  enddate 
3 2014-01-04 2014-01-05 
3 2014-01-08 2014-01-10 
5 2014-01-04 2014-01-10 

ответ

1

Вы хотите периоды, где ischanged 0. Вы можете сделать это, используя различия row_number():

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 = 0 
group by id, grp; 
+0

Спасибо за быстрый ответ. Но не знаю, как использовать решение по моему запросу –

+0

Спасибо за помощь! –