Возможная реализация:
WITH
source (dt) AS (
SELECT TO_TIMESTAMP('2023-01-01', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-02', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-05', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-09', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-15', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-16', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-17', 'YYYY-MM-DD') FROM DUAL UNION ALL
SELECT TO_TIMESTAMP('2023-01-27', 'YYYY-MM-DD') FROM DUAL
),
recurse (dt, step) AS (
SELECT dt, 1
FROM source
UNION ALL
SELECT source.dt, recurse.step + 1
FROM source
JOIN recurse ON source.dt >= recurse.dt + INTERVAL '7' DAY
)
SELECT TO_CHAR(MIN(dt), 'YYYY-MM-DD') dt
FROM recurse
GROUP BY step
DT |
2023-01-01 |
2023-01-09 |
2023-01-16 |
2023-01-27 |
fiddle