Объединение дат в периоды по группе с несколькими столбцами
Есть таблица А:
Id1 id2 Dt
--- --- ----------
a a 01.01.2020
a a 02.01.2020
a a 03.01.2020
a b 04.01.2020
a b 05.01.2020
a b 06.01.2020
a b 07.01.2020
a c 08.01.2020
a c 09.01.2020
a a 10.01.2020
a a 11.01.2020
a a 12.01.2020
b a 01.02.2020
b a 02.02.2020
b a 03.02.2020
b b 04.02.2020
b b 05.02.2020
b b 06.02.2020
b b 07.02.2020
b c 08.02.2020
b c 09.02.2020
b c 10.02.2020
b d 11.02.2020
b d 12.02.2020
b d 13.02.2020
b d 14.02.2020
И таблица Б:
Id1 id2 dt_start dt_finish
--- --- ---------- ----------
a a 01.01.2020 03.01.2020
a b 04.01.2020 07.01.2020
a c 08.01.2020 09.01.2020
a a 10.01.2020 12.01.2020
b a 01.02.2020 03.02.2020
b b 04.02.2020 07.02.2020
b c 08.02.2020 10.02.2020
b d 11.02.2020 14.02.2020
Как можно из таблицы А получить таблицу Б?
Думал о рекурсивном запросе, о GROUP BY, но никак не могу найти путь решения.
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
WITH cte AS ( SELECT id1, id2, dt,
ROW_NUMBER() OVER (ORDER BY dt) - ROW_NUMBER() OVER (PARTITION BY id1, id2 ORDER BY dt) group_number
FROM test )
SELECT id1,
id2,
MIN(dt) dt_start,
MAX(dt) dt_finish
FROM cte
GROUP BY id1, id2, group_number
ORDER BY dt_start;
Автор решения: 0xdb
→ Ссылка
Можно так:
select id1, id2, min (dt) dtstart, max (dt) dtend from (
select q.*, sum (case when prev != id1||id2 then 1 else 0 end) over (order by dt) grp
from (
select a.*, lag (id1||id2) over (order by dt) prev
from A) q
) group by id1, id2, grp order by grp;
Результат как и ожидался:
ID1 ID2 DTSTART DTEND
--- --- ---------- ----------
a a 01.01.2020 03.01.2020
a b 04.01.2020 07.01.2020
a c 08.01.2020 09.01.2020
a a 10.01.2020 12.01.2020
b a 01.02.2020 03.02.2020
b b 04.02.2020 07.02.2020
b c 08.02.2020 10.02.2020
b d 11.02.2020 14.02.2020