Объединение дат в периоды по группе с несколькими столбцами

Есть таблица А:

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
→ Ссылка