我試圖獲取顯示位置和日期更改的記錄列表,以顯示每個顯示先前位置的記錄的一行顯示。 基本上查詢取像數據:SQL - 按照日期列返回以前的記錄詳細信息
並顯示它想:
我試着用lag
,但是它混淆了一些記錄。任何人都可以建議一個很好的方法來做到這一點?
謝謝!
我試圖獲取顯示位置和日期更改的記錄列表,以顯示每個顯示先前位置的記錄的一行顯示。 基本上查詢取像數據:SQL - 按照日期列返回以前的記錄詳細信息
並顯示它想:
我試着用lag
,但是它混淆了一些記錄。任何人都可以建議一個很好的方法來做到這一點?
謝謝!
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
如果你只有2次移動,那麼前面建議的簡單連接就可以完成。如果你有更多的row_number方法可能會更好。您可能需要調整連接以處理如何顯示只有一個條目的ID –
,您可以嘗試:
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
無效的組。一般的GROUP BY規則說:「如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或作爲set函數的參數。」 – jarlh
普萊斯試試這個。它適用於這裏
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
自我加入,或分組。再添加一個Joe行,以及一個Alice行。然後調整結果! – jarlh
自加入+'where A.date> b.date'就足夠了。 – qxg
您使用的是哪個版本的SQL Server?如果2012年或以上,你可以使用滯後和領導功能 – Matt