Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Datas contíguas do SQL Server - resumindo várias linhas em linhas de data de início e término contíguas sem CTEs, loops,... s


Você pode aproveitar os dois funções da janela e o uso de um conceito chamado gaps-and-islands . No seu caso, datas contíguas seriam a ilha, e as lacunas são autoexplicativas.

Eu escrevi a resposta abaixo de forma detalhada para ajudar a deixar claro o que a consulta está fazendo, mas provavelmente poderia ser escrita de uma maneira diferente, mais concisa. Por favor, veja meus comentários na resposta explicando o que cada etapa (sub-consulta) faz.
--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