Создание групп дат в SQL Сервер - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть таблица, содержащая идентификаторы и даты, я хочу, чтобы группы дат для каждого идентификатора

 id      date 
 ------------------
  1      2019-01-01
  2      2019-01-01
  1      2019-01-02
  2      2019-01-02
  2      2019-01-03
  1      2019-01-04
  1      2019-01-05
  2      2019-01-05
  2      2019-01-06

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

id      from             to
------------------------------------
 1      2019-01-01       2019-01-02
 1      2019-01-04       2019-01-05
 2      2019-01-01       2019-01-03
 2      2019-01-05       2019-01-06

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

Это форма проблемы пробелов и островков. Самое простое решение - сгенерировать порядковый номер для каждого идентификатора и вычесть его из даты. Это константа для последовательных дат.

Итак:

select id, min(date), max(date)
from (select t.*, row_number() over (partition by id order by date) as seqnum
      from t
     ) t
group by id, dateadd(day, -seqnum, date)
order by id, min(date);

Здесь - это db <> скрипка.

0 голосов
/ 19 апреля 2020

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

select id, min(date) from_date, max(date) to_date
from (
    select 
        t.*, 
        sum(case when date = dateadd(day, 1, lag_date) then 0 else 1 end) 
            over(partition by id order by date) grp
    from (
        select 
            t.*, 
            lag(date) over(partition by id order by date) lag_date
        from mytable t
    ) t
) t
group by id, grp
order by id, from_date
...