2016-04-27 4 views
-1

Ich versuche, eine Liste mit Datensätzen zu erhalten, die Änderungen der Position und der Daten anzeigen, die für jeden Datensatz, der den vorherigen Speicherort anzeigt, als eine Zeile angezeigt werden. Im Grunde eine Abfrage nehmen Daten wie:SQL - Gibt vorherige Datensatzdetails als Spalte nach Datum zurück

enter image description here

Und zeigen Sie es mögen:

enter image description here

Ich versuchte lag verwenden, aber es mischt einige der Aufzeichnungen auf. Kann jemand einen guten Weg vorschlagen, dies zu tun?

Danke!

+0

Self Join, oder Gruppe von. Fügen Sie eine weitere Joe-Zeile und eine einzelne Alice-Zeile hinzu. Passen Sie dann das Ergebnis an! – jarlh

+0

Self join + 'where A.date> b.date' ist genug. – qxg

+0

Welche Version von SQL Server verwenden Sie? wenn 2012 oder älter, können Sie die Lag - und Lead - Funktionen verwenden – Matt

Antwort

0
DECLARE @TABLE TABLE 
(ID INT ,NAME VARCHAR(20), LOCATIONDATE DATETIME, REASON VARCHAR(20)) 
INSERT INTO @TABLE 
(ID,NAME, LOCATIONDATE, REASON) 
VALUES 
(1,'abc',CAST('2016/01/01' AS SMALLDATETIME),'move'), 
(2,'def',CAST('2016/02/01' AS SMALLDATETIME),'move'), 
(1,'abc',CAST('2016/06/01' AS SMALLDATETIME),'move'), 
(2,'def',CAST('2016/07/01' AS SMALLDATETIME),'move'), 
(1,'abc',CAST('2016/08/01' AS SMALLDATETIME),'move'), 
(3,'ghi',CAST('2016/08/01' AS SMALLDATETIME),'move') 

select s.* 
     ,t1.* 
from 
(
select t.*, 
     row_number() over (partition by id order by locationdate desc) rn 
from @table t 
) s 
left join 
(
select t.*, 
     row_number() over (partition by id order by locationdate desc) rn 
from @table t 
) t1 
on t1.id = s.id and t1.rn = s.rn + 1 
+0

Wenn Sie nur 2 Züge haben, dann wird ein einfacher Join wie zuvor vorgeschlagen. Wenn Sie mehr haben, dann wird eine row_number-Methode wahrscheinlich besser sein. Möglicherweise müssen Sie den Join anpassen, um zu entscheiden, wie Sie IDs anzeigen möchten, die nur einen Eintrag haben –

0

Sie können es versuchen:

SELECT a.id,a.name,a.location as currentLocation,a.locationdatedate as currrentLocate,b.location as preLocation,b.locationdatedate as prevLocate,a.changereason 
FROM test as a 
JOIN test as b ON a.name = b.name 
where a.locationdatedate > b.locationdatedate 
group by a.name 
+0

Ungültige Gruppe von. Die allgemeine GROUP BY-Regel besagt: "Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte identifizieren oder das Argument einer set-Funktion sein." – jarlh

0

Pleas versuchen diese. es funktioniert hier

SELECT l.id, 
    ,l.name 
    ,l.location as currentLocation 
    ,l.locationdatedate as currrentLocate 
    ,r.location as preLocation 
    ,r.locationdatedate as prevLocate 
    ,r.changereason 
FROM tableName AS l inner join 
tableName AS r ON r.id=l.id 
WHERE l.locationdatedate !=r.locationdatedate AND l.locationdatedate > r.locationdatedate 
Verwandte Themen