2017-02-06 80 views
0

我覺得這應該很容易,但我很難得到它。我們有一個UnitID,DateTimeStamp和UnitStatus表。像這樣:SQL查找符合特定條件的最新記錄

enter image description here

我試圖找到每個單元的最新記錄(基於DateTimeStamp),如果他們最後UnitStatus爲LO。所以在截圖我已經採取了我會希望有一個樣本數據庫的它返回:

E02 2017-02-06 03:00:00 LO ..... 
E04 2017-02-06 06:00:00 LO 

(它不會自己LO的UnitStatus後返回E03 E03,因爲有AV的UnitStatus)

我試着用不同的where語句做max(cdts)。將查詢連接到使用max(cdts)的另一個查詢。但無論我嘗試什麼,我都不會得到我期待的結果。

回答

0

試試這個。 更新閱讀更新的問題後,我已經更新了我的答案

SELECT tbl1.* 
FROM defaulttable as tbl1 
RIGHT JOIN 
(
    SELECT UnitStatus FROM defaulttable 
    WHERE UnitStatus = 'LO' 
) as tbl2 
ON tbl1.UnitStatus != tbl2.UnitStatus 
WHERE tbl1 != 'LO' 
ORDER BY tbl1.DateTimeStamp 
0

與DESC關鍵字試試這個

SELECT * from table 
WHERE UnitStatus = 'LO' 
ORDER BY DateTimeStamp desc 
0

嘗試使用窗口函數ROW_NUMBER以獲得每個單元ID

Select * 
From (
    Select 
    t.*, 
    Row_number() over (partition by UnitID order by datetimestamp desc) rn 
    From your_table t 
    Where UnitStatus = 'LO' 
) t where rn = 1 
的最新記錄
0
with cte as (
    select *, 
    Row_number() over (partition by UnitID order by DateTimeStamp desc) as rn 
    from theTable 
) 
select * 
from cte 
where rn = 1 
and UnitStatus = 'LO' 
0

SELECT DISTINCT檢索UnitIDs,在OUTER APPLY版子查詢檢索與最近的狀態,「LO」的unitIDs:

with t as (select distinct unitid from SO42060982) 
select t.*, sub.* 
from t 
outer apply 
    (select top 1 * from SO42060982 sub 
    where t.UnitID = sub.UnitID order by DateTimeStamp desc) sub 
where sub.UnitStatus = 'LO' 
0

使用ROW_NUMBER()函數作爲上述規定獲得的最新記錄每個單元ID。作爲第二步根據自己的rowIndex和狀態篩選記錄,那麼我認爲你應該能夠實現你正在尋找

步驟1

SELECT U.*, 
ROW_NUMBER() OVER (PARTITION BY UNITID ORDER BY DATETIMESTAMP DESC) SNO 
INTO #UNITSTEMP 
FROM UNITS U 

步驟2

SELECT DISTINCT * FROM #UNITSTEMP WHERE SNO = 1 AND UNITSTATUS = 'LO' 

運行上述查詢後,您的結果將如下面的屏幕截圖所示 enter image description here