sql | uninterrupted date subsets in a date column
had to look for uninterrupted subsets (with low and high value of each uninterrupted seq) from a date column where few random dates where missing, i don't know how to explain that
sample table:
CREATE TABLE TMP_LB_TABLE AS
SELECT TO_DATE('01/11/2021', 'DD/MM/RRRR') + LEVEL - 1 DATE_FIELD
FROM DUAL
CONNECT BY LEVEL <= ( TO_DATE('30/11/2021', 'DD/MM/RRRR')
- TO_DATE('01/11/2021', 'DD/MM/RRRR'));
DELETE TMP_LB_TABLE WHERE DATE_FIELD = TO_DATE('11/11/2021', 'DD/MM/RRRR');
DELETE TMP_LB_TABLE WHERE DATE_FIELD = TO_DATE('21/11/2021', 'DD/MM/RRRR');
COMMIT;
the following query will return low value and high value, and how many values are within that range:
SELECT MIN (DATE_FIELD) DATE_FROM,
MAX (DATE_FIELD) DATE_TO,
COUNT (*) NUM_OF_VAL
FROM (SELECT DATE_FIELD,
DATE_FIELD
- ROW_NUMBER ()
OVER (ORDER BY DATE_FIELD) AS LB
FROM TMP_LB_TABLE
ORDER BY DATE_FIELD)
GROUP BY LB
ORDER BY 1;
/*
DATE_FROM DATE_TO NUM_OF_VAL
--------- --------- ----------
01-NOV-21 10-NOV-21 10
12-NOV-21 20-NOV-21 9
22-NOV-21 29-NOV-21 8
3 rows selected.
*/