0

ich eine SQL Server-Tabelle mit der folgenden Struktur haben:Finden Reihe Änderungen und Ausgabe in Tabelle

id  TransDate   PartType 
====================================== 
1  2016-06-29 10:23:00 A1 
2  2016-06-29 10:30:00 A1 
3  2016-06-29 10:32:00 A2 
4  2016-06-29 10:33:00 A2 
5  2016-06-29 10:35:00 A2 
6  2016-06-29 10:39:00 A3 
7  2016-06-29 10:41:00 A4 

Ich brauche eine SELECT Anweisung, die folgende Ausgabe eine Tabelle, die die Änderungen in PartType findet, und das sieht wie folgt aus (für SSRS Zwecke):

PartType StartTime    EndTime  
======================================================= 
A1   2016-06-29 10:23:00 2016-06-29 10:32:00 
A2   2016-06-29 10:32:00 2016-06-29 10:39:00 
A3   2016-06-29 10:39:00 2016-06-29 10:41:00 
A4   2016-06-29 10:41:00 NULL 

Beachten sie, dass die StartTime immer nimmt vom letzten EndTime, es sei denn, es der erste Datensatz in der Tabelle ist.

Was sollte meine SELECT Aussage sein? Ich kann nicht die gewünschten Ergebnisse erzielen.

EDIT: Ich benutze SQL Server 2008 R2; Ich hätte das spezifizieren sollen.

Antwort

1

Mit SQL Server 2012 und höher können Sie verwenden:

declare @t table (id int, transdate datetime2(0), parttype char(2)) 

insert @t 
values 
(1,  '2016-06-29 10:23:00', 'A1'), 
(2,  '2016-06-29 10:30:00', 'A1'), 
(3,  '2016-06-29 10:32:00', 'A2'), 
(4,  '2016-06-29 10:33:00', 'A2'), 
(5,  '2016-06-29 10:35:00', 'A2'), 
(6,  '2016-06-29 10:39:00', 'A3'), 
(7,  '2016-06-29 10:41:00', 'A4') 

;with x as (
select *, row_number() over(partition by parttype order by transdate) rn 
from @t 
) 
select parttype, transdate starttime, lead(transdate) over (order by transdate) from x where rn = 1 
+0

Entschuldigung, ich benutze SQL Server 2008 R2. Ich habe OP bearbeitet. – controller

2

Hmmm, hier ist eine Methode outer apply und group by mit:

select t1.PartType, min(t1.TransDate) as StartTime, t2.TransDate 
from t t1 
outer apply 
    (select top 1 t2.* 
     from t t2 
     where t2.PartType <> t1.PartType and t2.TransDate > t1.TransDate 
     order by t2.TransDate asc 
    ) t2 
group by t1.PartType, t2.TransDate; 
+0

Es ist selten, Außen zu sehen Beispiele gelten! – BIDeveloper

+1

das funktioniert nicht - wo ist t1 definiert? – controller

+0

Das ist ein verlorener 't' Tischalias sicher. Guck mal. –