Получение максимальной последовательной полосы с событиями - PullRequest
0 голосов
/ 12 декабря 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-07  1
2018-12-06  1
2018-12-06  1
2018-12-06  1
2018-12-05  1
2018-12-04  1
2018-12-03  0

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

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

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

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

select 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)

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

Спасибо!

1 Ответ

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

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

select * 
from (
  select date as day_after_streak
   , lag(date) over(order by date asc) as previous_zero_date 
   , date - lag(date) over(order by date asc) as difference
   , date_part('days', date - lag(date) over(order by date asc) ) - 1 as streak_in_days
  from dates

  group by date
  having sum(events) = 0 ) t 
where t.streak_in_days is not null
order by t.streak_in_days desc
limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...