Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kontinuierliche SQL Server-Daten – Zusammenfassen mehrerer Zeilen in zusammenhängende Start- und Enddatumszeilen ohne CTEs, Schleifen usw

Sie können beide Vorteile nutzen Fensterfunktionen und die Verwendung eines Konzepts namens gaps-and-islands . In Ihrem Fall wären zusammenhängende Daten die Insel, und die Lücken sind selbsterklärend.

Ich habe die Antwort unten ausführlich geschrieben, um zu verdeutlichen, was die Abfrage tut, aber sie könnte höchstwahrscheinlich auf eine andere, prägnantere Weise geschrieben werden. Bitte sehen Sie sich meine Kommentare in der Antwort an, in denen erklärt wird, was jeder Schritt (Unterabfrage) bewirkt.

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