Выбрать периоды из SQL Server

У меня есть таблица, содержащая дату и время и флаг, что-то вроде этого:

2014-11-06 | True
2014-11-07 | True
2014-11-08 | True
2014-11-09 | False
2014-11-10 | False
2014-11-11 | True
2014-11-12 | True
2014-11-13 | False
2014-11-14 | True
2014-11-15 | False

Мне нужна помощь с SQL-запросом, который возвращает минимальную и максимальную дату для каждого периода True, например:

2014-11-06 | 2014-11-08
2014-11-11 | 2014-11-12
2014-11-14 | 2014-11-14

Пожалуйста помоги. Это может быть запрос LinqToSql или T-SQL. Спасибо


person Limatons    schedule 29.09.2014    source источник


Ответы (2)


Последовательные периоды «истины» обладают хорошим свойством. Если вычесть из дат возрастающую последовательность чисел, все в группе будет иметь одну и ту же дату. Вы можете применить эту логику:

select min(dt), max(dt)
from (select dt,
             (dt - row_number() over (order by dt) ) as grp
      from table t
      where flag = true
     ) t
group by grp;
person Gordon Linoff    schedule 29.09.2014

Мне нравится подход ниже, но если в вашем наборе данных отсутствует дата, это не сработает. Я пробовал это, может быть полезно для тех, у кого есть такой набор данных.

Select Min(dt), Max(dt) 
from (Select dt, r_num, 
            (r_num - row_number() over(order by r_num)) as grp
      From ( select dt,flag, 
                    row_number() over(Order by dt) r_num
              From table t ) x
      Where flag = 'true'
     ) t
group by grp
person Sagar    schedule 29.09.2014