Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Dates contiguës SQL Server - résumant plusieurs lignes en lignes de date de début et de fin contiguës sans CTE, boucles, ... s

Vous pouvez profiter à la fois de fonctions de fenêtre et l'utilisation d'un concept appelé gaps-and-islands . Dans votre cas, les dates contiguës seraient l'île, et les écarts s'expliquent d'eux-mêmes.

J'ai écrit la réponse ci-dessous de manière détaillée pour aider à clarifier ce que fait la requête, mais elle pourrait très probablement être écrite d'une manière différente qui est plus concise. Veuillez consulter mes commentaires dans la réponse expliquant ce que fait chaque étape (sous-requête).

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