sql | uninterrupted date subsets in a date column

·

1 min read

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.
*/