#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