sql >> Database >  >> RDS >> Sqlserver

SQL Server aaneengesloten datums - het samenvatten van meerdere rijen in aaneengesloten rijen met start- en einddatum zonder CTE's, lussen,...

U kunt profiteren van beide vensterfuncties en het gebruik van een concept genaamd gaps-and-islands . In jouw geval zouden aaneengesloten datums het eiland zijn, en de hiaten spreken voor zich.

Ik heb het antwoord hieronder op een uitgebreide manier geschreven om duidelijk te maken wat de query doet, maar het kan hoogstwaarschijnlijk op een andere manier worden geschreven die beknopter is. Zie mijn opmerkingen in het antwoord waarin wordt uitgelegd wat elke stap (subquery) doet.

--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. haal datum uit tijdstempel in postgreSQL

  2. Oracle Merge vs Select en vervolgens invoegen of bijwerken

  3. Converteren tussen tijdzones in Postgres

  4. Converteer object met herhaalde velden naar JSON