Определение непрерывности длины последовательности дат в postgres

Есть ли простой способ определить продолжительность непрерывности в последовательности дат в Postgres?

Для простоты, допустим, у меня есть таблица дат, например:

2017-01-01
2017-01-02
2017-01-03
2017-01-04
2017-01-06
2017-01-08
2017-01-09

Для каждой даты я хочу знать ее количество в непрерывной последовательности дат. Так что я бы хотел:

2017-01-01 1
2017-01-02 2
2017-01-03 3
2017-01-04 4
2017-01-06 1
2017-01-08 1
2017-01-09 2

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

1 ответ

Решение

Вы можете идентифицировать последовательности, вычитая порядковый номер. Постоянные значения тогда представляют последовательность. После этого ваше перечисление является приложением row_number():

select t.date,
       row_number() over (partition by date - seqnum * interval '1 day' order by date) as col2
from (select t.*,
             row_number() over (order by date) as seqnum
      from t
     ) t;
Другие вопросы по тегам