sql >> Base de Datos >  >> RDS >> Sqlserver

Fechas contiguas de SQL Server:resumen de varias filas en filas contiguas de fecha de inicio y finalización sin CTE, bucles,...

Puede aprovechar ambos funciones de ventana y el uso de un concepto llamado gaps-and-islands . En su caso, las fechas contiguas serían la isla, y los espacios en blanco se explican por sí mismos.

Escribí la respuesta a continuación de forma detallada para ayudar a aclarar qué está haciendo la consulta, pero lo más probable es que se pueda escribir de una manera diferente que sea más concisa. Consulte mis comentarios en la respuesta que explican qué hace cada paso (subconsulta).

--Determine Final output
select min(c.StartDate) as StartDate
, max(c.EndDate) as EndDate
from (
    --Assign a number to each group of Contiguous Records
    select b.ID
    , b.StartDate
    , b.EndDate
    , b.EndDatePrev
    , b.IslandBegin
    , sum(b.IslandBegin) over (order by b.ID asc) as IslandNbr
    from (
        --Determine if its Contiguous (IslandBegin = 1, means its not Contiguous with previous record)
        select a.ID
        , a.StartDate
        , a.EndDate
        , a.EndDatePrev
        , case when a.EndDatePrev is NULL then 1
               when datediff(d, a.EndDatePrev, a.StartDate) > 1 then 1
               else 0
          end as IslandBegin
        from (
            --Determine Prev End Date
            select tt.ID
            , tt.StartDate
            , tt.EndDate
            , lag(tt.EndDate, 1, NULL) over (order by tt.ID asc) as EndDatePrev
            from dbo.Table_Name as tt
            ) as a
        ) as b
    ) as c
group by c.IslandNbr
order by c.IslandNbr