Получение максимальной последовательной полосы с событиями - обновленный вопрос - PullRequest
0 голосов
/ 17 декабря 2018

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

Я ищуодин запрос, если это возможно, запуск PostgreSQL 9.6.6 под pgAdmin3 v1.22.1

У меня есть таблица с датой и строкой для каждого события в дате:

    Date        Events
    2018-12-10  1
    2018-12-10  1
    2018-12-10  0
    2018-12-09  1
    2018-12-08  0
    2018-12-08  0
    2018-12-07  1
    2018-12-06  1
    2018-12-06  1
    2018-12-06  0
    2018-12-06  1
    2018-12-04  1
    2018-12-03  0

I 'ищу самую длинную последовательность дат без перерыва.В этом случае 2018-12-08 и 2018-12-03 являются единственными датами без событий, есть две даты с событиями между 2018-12-08 и today и три между 2018-12-8 и 2018-12-07 - поэтому я бы хотелответ 3.

Я знаю, что могу сгруппировать их с чем-то вроде:

Select Date, count(Date) from Table group by Date order by Date Desc

Чтобы получить только самую последнюю последовательность, у меня есть что-то вроде этого - subqueryвозвращает самую последнюю дату без событий, а внешний запрос подсчитывает даты после этой даты:

select date, count(distinct date) from Table
where date>
  ( select date from Table
    group by date
    having count (case when Events is not null then 1 else null end) = 0
    order by date desc
    fetch first row only)
group by date

Но теперь мне нужна самая длинная полоса, а не только самая последняя полоса.

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

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете назначить группу, выполнив кумулятивный подсчет 0.Затем посчитайте разные даты в каждой группе:

select count(*), min(date), max(date), count(distinct date)
from (select t.*,
             count(*) filter (where events = 0) over (order by date) as grp
      from t
     ) t
group by grp
order by count(distinct date) desc
limit 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...