2016-04-27 44 views
-1

我試圖獲取顯示位置和日期更改的記錄列表,以顯示每個顯示先前位置的記錄的一行顯示。 基本上查詢取像數據:SQL - 按照日期列返回以前的記錄詳細信息

enter image description here

並顯示它想:

enter image description here

我試着用lag,但是它混淆了一些記錄。任何人都可以建議一個很好的方法來做到這一點?

謝謝!

+0

自我加入,或分組。再添加一個Joe行,以及一個Alice行。然後調整結果! – jarlh

+0

自加入+'where A.date> b.date'就足夠了。 – qxg

+0

您使用的是哪個版本的SQL Server?如果2012年或以上,你可以使用滯後和領導功能 – Matt

回答

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

如果你只有2次移動,那麼前面建議的簡單連接就可以完成。如果你有更多的row_number方法可能會更好。您可能需要調整連接以處理如何顯示只有一個條目的ID –

0

,您可以嘗試:

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

無效的組。一般的GROUP BY規則說:「如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或作爲set函數的參數。」 – jarlh

0

普萊斯試試這個。它適用於這裏

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 
相關問題