sql >> Databáze >  >> RDS >> Sqlserver

Souvislá data SQL Serveru - shrnutí více řádků do souvislých řádků počátečního a koncového data bez CTE, smyček,...

Můžete využít obě výhody funkce oken a použití konceptu zvaného gaps-and-islands . Ve vašem případě by sousední data představovala ostrov a mezery jsou samozřejmé.

Odpověď níže jsem napsal podrobným způsobem, aby bylo jasné, co dotaz dělá, ale s největší pravděpodobností by to mohlo být napsáno jiným způsobem, který je stručnější. Podívejte se prosím na mé komentáře v odpovědi vysvětlující, co každý krok (poddotaz) dělá.

--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. Zkontrolujte, zda je uživatel na stránce

  2. Problémy s výkonem funkce SQL Server

  3. Některé problémy se Sphinx a PHP

  4. mysql vytvoří nový řádek namísto aktualizace existujícího