sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server sammanhängande datum - sammanfattar flera rader till sammanhängande start- och slutdatumsrader utan CTE:er, loopar, ...

Du kan dra nytta av både fönsterfunktioner och användningen av ett koncept som kallas gaps-and-islands . I ditt fall skulle sammanhängande datum vara ön, och luckorna är självförklarande.

Jag skrev svaret nedan på ett utförligt sätt för att göra det tydligt vad frågan gör, men det kan med största sannolikhet skrivas på ett annat sätt som är mer kortfattat. Se mina kommentarer i svaret som förklarar vad varje steg (underfråga) gör.

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


  1. POWER() Exempel i SQL Server

  2. Byt namn på en främmande nyckel i SQL Server med T-SQL

  3. Oracle-databas:dela en sträng med tecken

  4. Hur man lägger till ett radnummer i en grupp i min fråga