Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Date contigue di SQL Server:riepilogo di più righe in righe di data di inizio e fine contigue senza CTE, loop,...

Puoi sfruttare entrambi funzioni finestra e l'uso di un concetto chiamato gaps-and-islands . Nel tuo caso, le date contigue sarebbero l'isola e le lacune si spiegano da sole.

Ho scritto la risposta di seguito in modo dettagliato per chiarire cosa sta facendo la query, ma molto probabilmente potrebbe essere scritta in un modo diverso che è più conciso. Si prega di vedere i miei commenti nella risposta che spiegano cosa fa ogni passaggio (sottoquery).

--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