#sql #window
Вот такой вопрос появился на канале @data_engineerette
Моё решение такое:
Поиграться можно здесь или здесь
Вот такой вопрос появился на канале @data_engineerette
Моё решение такое:
SELECT event_type, date_start, date_end
FROM (
SELECT event_type,
FIRST_VALUE(date) OVER (PARTITION BY event_mark ORDER BY date) AS date_start,
LAST_VALUE(next_date) OVER (PARTITION BY event_mark ORDER BY date) AS date_end,
last_event
FROM (
SELECT event_type, date, next_date, last_event,
sum(cng_event) over (order by date rows between unbounded preceding and current row) AS event_mark
FROM (
SELECT event_type, date,
LEAD(date, 1, NULL) OVER (PARTITION BY 1 ORDER BY date) AS next_date,
CASE WHEN LAG(event_type, 1, 0) OVER (PARTITION BY 1 ORDER BY date) = event_type THEN 0 ELSE 1 END AS cng_event,
CASE WHEN LEAD(event_type, 1, 0) OVER (PARTITION BY 1 ORDER BY date) <> event_type THEN 1 ELSE 0 END AS last_event
FROM events
ORDER BY date) AS inn
) AS outt) AS final_tab
WHERE last_event = 1
ORDER BY 2;
Поиграться можно здесь или здесь