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

SQL Server:kolik dní byla každá položka v každém stavu

Získáte tak stejné výsledky, jaké požadujete, v trochu jiném formátu (ale můžete snadno najít PIVOT řešení, pokud potřebujete přesně stejnou sadu výsledků):

declare @t table (ItemId int,Revision int,State varchar(19),DateChanged datetime2)
insert into @t(ItemId,Revision,State,DateChanged) values
(1,1,'New',   '2014-11-13T10:00:00'),
(1,2,'Active','2014-11-15T10:00:00'),
(1,3,'New',   '2014-11-17T10:00:00'),
(1,4,'Active','2014-11-19T10:00:00'),
(1,5,'Active','2014-11-20T10:00:00'),
(1,6,'Closed','2014-11-22T10:00:00'),
(2,1,'New',   '2014-11-13T10:00:00'),
(2,2,'Active','2014-11-16T10:00:00'),
(2,3,'Closed','2014-11-17T10:00:00'),
(2,4,'Active','2014-11-19T10:00:00'),
(2,5,'Closed','2014-11-21T10:00:00')

;With Joined as (
    select t1.ItemId,t1.State,DATEDIFF(day,t1.DateChanged,t2.DateChanged) as Days
    from
        @t t1
            inner join
        @t t2
            on
                t1.ItemId = t2.ItemId and
                t1.Revision = t2.Revision -1
    )
select ItemId,State,SUM(Days)
from Joined
where State <> 'Closed'
group by ItemId,State

Výsledek:

ItemId      State               
----------- ------------------- -----------
1           Active              5
1           New                 4
2           Active              3
2           New                 3

Všimněte si, že ignoruji PreviousState sloupec z vaší otázky a místo toho vytvářím Joined protože to, na čem opravdu záleží, je kdy další vstoupil v platnost.

Problémy, kterými jsme se nezabývali, protože jste je ve své otázce nepopsali:1) Co dělat, když aktuální konečný stav není Closed - tj. budeme to ignorovat nebo počítáme do dneška? a 2) Co dělat, když je čas dne pro každý DateChanged není totéž – musíme zvládnout dílčí dny?



  1. SQL Server Agent – ​​balíček SSIS – chyba 0x80131904 – vypršel časový limit

  2. Jak vrátit počet sekund po půlnoci v databázi Oracle

  3. Pomalý jednoduchý aktualizační dotaz na databázi PostgreSQL s 3 miliony řádků

  4. Oznámení ClusterControl 1.5 – s automatickým ověřováním zálohy a nahráváním do cloudu