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

SQL Server sammenhængende datoer - opsummerer flere rækker i sammenhængende start- og slutdatorækker uden CTE'er, loops, ...

Du kan drage fordel af både vinduefunktioner og brugen af ​​et koncept kaldet gaps-and-islands . I dit tilfælde ville sammenhængende datoer være øen, og hullerne er selvforklarende.

Jeg skrev svaret nedenfor på en udførlig måde for at gøre det klart, hvad forespørgslen gør, men det kunne højst sandsynligt skrives på en anden måde, der er mere kortfattet. Se venligst mine kommentarer i svaret, der forklarer, hvad hvert trin (underforespørgsel) 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. Prisma, hvordan man rydder databasen

  2. Kan du ikke køre Indsæt og vælg LAST_INSERT_ID() i den samme forespørgsel?

  3. Forventet databasemodel er inkonsekvent i realtid

  4. mysql Adgang nægtet for bruger ''@'localhost' til databasen ''