Найдите максимальное количество дней между последовательными событиями

#sql #postgresql

Вопрос:

Я пытаюсь найти максимальное количество дней между любыми последовательными событиями для каждой компании. У меня есть таблица events с полями company , eventid , date .

 |eventid|company |date| |1 | Company1 |2020-10-15| |2 | Company2 |2018-03-22| |3 | Company2 |2019-12-02| |4 | Company3 |2021-01-02| |5 | Company3 |2019-06-20| |6 | Company1 |2018-07-21| |7 | Company2 |2016-10-18| |8 | Company2 |2017-04-12| |9 | Company1 |2020-05-07| |10| Company3 |2021-11-03|  

Мне удалось получить столбец количества дней между каждым последовательным событием:

 select e1.company, e1.date, (e1.date - min(e2.date)) as daysbetween  from events e1 join events e2 on (e1.company=e2.company and e2.date gt; e1.date) group by e1.company,e1.date;  

Это возвращает 10 результатов, но мне нужно только максимум из столбца «Дни между» для каждой компании, что даст 3 результата. Однако, поскольку я использовал min() столбец «дни между», я не могу max() снова использовать этот столбец, чтобы найти максимум для каждой компании.

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

Ответ №1:

Вы можете использовать функцию СВИНЦА. Я привожу пример PosgreSQL, так как заметил, что вы отметили PostgreSQL.

Вот CTE разбит на этапы, чтобы было понятно, как это работает:

 ;with cte1 as (  select   company, eventDate, LEAD(eventDate, 1) OVER (PARTITION BY company ORDER BY eventDate) as nextEventDate  from tbl  order by company, eventDate ), cte2 as (  select   company, nextEventDate - eventDate as daysBetweenEvents  from cte1 ), cte3 as (  select company, max(daysBetweenEvents)  from cte2  group by company ) select * from cte3  

Ответ №2:

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

 Select Company, Max(daysbetween) From (Select Company, date - Lag(date) Over (Partition by Company Order by date) As daysbetween From events) As T Group by Company