• Here is the updated code:

    ;

    WITH unique_dates AS (

    SELECT DISTINCT p.Price, d.dt, d.is_start

    FROM #prices p

    CROSS APPLY (VALUES(p.date_from, 1), (DATEADD(DAY, 1, p.date_to), 0)) d(dt, is_start)

    )

    , packed_dates AS (

    SELECT ud.price, ud.dt, ud.is_start,

    CASE

    WHEN LEAD(ud.dt, 1, '9999') OVER(PARTITION BY ud.price ORDER BY ud.dt, ud.is_start) = ud.dt THEN 1

    WHEN LAG(ud.dt, 1, '1900') OVER(PARTITION BY ud.price ORDER BY ud.dt, ud.is_start) = ud.dt THEN 1

    END AS exclusion_flag

    FROM unique_dates ud

    )

    , date_ranges AS (

    SELECT pd.dt AS date_from, LEAD(pd.dt) OVER(ORDER BY pd.dt) AS date_to

    FROM packed_dates pd

    WHERE pd.exclusion_flag IS NULL

    )

    SELECT dr.date_from, DATEADD(DAY, -1, dr.date_to) AS date_to, MIN(p.price) AS price

    FROM date_ranges dr

    INNER JOIN #prices p

    ON p.date_from < dr.date_to

    AND p.date_to >= dr.date_from

    WHERE dr.date_from < dr.date_to

    GROUP BY dr.date_from, dr.date_to

    ;

    I've split the first CTE into two parts. The first one finds the unique values that I mentioned, the second one sets the exclusion flags.

    Drew

    J. Drew Allen
    Business Intelligence Analyst
    Philadelphia, PA