Найти непрерывные даты в PostgreSQL - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь решить один запрос, который уже решен на SQL Сервере.

Напишите запрос SQL, чтобы найти непрерывные даты, по крайней мере, три раза.

SQLfiddle

Таблица: orders

*------------*
|   mdate    |
*------------*
|'2012-05-01'|
|'2012-05-02'|
|'2012-05-03'|
|'2012-05-06'|
|'2012-05-07'|
|'2012-05-10'|
|'2012-05-11'|
*------------*

SQL Сервер:

select
  mdate
from
(
   select
      mdate,
      count(gap) over (partition by gap) as total
  from
  (
    select
      mdate,
      dateadd(day, - row_number() over (order by mdate), mdate) as gap
    from orders
  ) t
) tt

where total >= 3

Результат:

*------------*
|   mdate    |
*------------*
|'2012-05-01'|
|'2012-05-02'|
|'2012-05-03'|
*------------*

Я не могу использовать функцию dateadd() в PostgreSQL, так как Я добиваюсь того же результата в этом?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

На SQL сервере это будет выглядеть следующим образом:

select mdate
from (select o.*,
             count(*) over (partition by dateadd(day, - seqnum, mdate)) as cnt
      from (select o.*,
                   row_number() over (order by mdate) as seqnum
            from orders o
           ) o
     ) o
where cnt >= 3;

В Postgres:

select mdate
from (select o.*,
             count(*) over (partition by mdate - seqnum * interval '1 day') as cnt
      from (select o.*,
                   row_number() over (order by mdate) as seqnum
            from orders o
           ) o
     ) o
where cnt >= 3;

Единственная разница - арифметика даты c.

1 голос
/ 06 апреля 2020

Вы можете сделать интервал из ваших ROW_NUMBER вычислений CONCAT с ' day' и типизацией; тогда вы можете вычесть это из mdate. Ваш запрос остается таким же, кроме изменения

dateadd(day, - row_number() over (order by mdate), mdate) as gap

на

mdate - concat(row_number() over (order by mdate), ' day')::interval as gap

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...