![](/img/trans.png)
[英]SQL Server join query to get row with latest date closest to another date
[英]SQL Server query. JOIN by latest date
我有3張桌子:
UnitInfo(UnitID, ...),
UnitList(UnitID, ...)
UnitMonitoring(RecordID,UnitID, EventDate, ...)
UnitList
的一個子集UnitInfo
(在數據方面和在列方面)。 UnitMonitoring
接收記錄的時間有關的時間UnitList
(每一個UnitID
在UnitMonitoring
我們會有多條記錄)灌裝EventDate
。 ( UnitInfo
已擴展信息)。
我想不出如何建立一個查詢,以便對每一個UnitID
在UnitList
我得到UnitMonitoring
記錄,使得EventDate
是最新的一個。
到目前為止我有
SELECT a.UnitID, a.Name, b.EventDate
FROM UnitInfo a INNER JOIN UnitMonitoring b
WHERE a.UnitID IN (SELECT UnitID FROM UnitList)
從UnitMonitoring
產生所有記錄
SELECT ul.unitId, um.*
FROM UnitList ul
OUTER APPLY
(
SELECT TOP 1 *
FROM UnitMonitoring umi
WHERE umi.UnitID = ul.unitID
ORDER BY
EventDate DESC
)
這將正確處理重復項並返回所有單元( UnitMonitoring
沒有記錄的UnitMonitoring
將在相應的字段中具有NULL
值)
嘗試:
Select M.*
From UnitList L
Join UnitMonitoring M
On M.UnitId = L.UnitId
Where M.EventDate =
(Select Max(EventDate) From UnitMonitoring
Where UnitId = M.UnitId)
如果有多個記錄具有相同的UnitId和EventDate,那么您仍然可以使用此技術,但是您需要對唯一字段進行過濾,比如在這種情況下UnitMonitoring中的PK字段名為PkId
。
Select M.*
From UnitList L
Join UnitMonitoring M
On M.UnitId = L.UnitId
Where M.PkId =
(Select Max(PkId) From UnitMonitoring iM
Where UnitId = M.UnitId
And EventDate =
(Select Max(EventDate) From UnitMonitoring
Where UnitId = M.UnitId))
我選擇使用公用表表達式 (CTE)來應用排名函數( ROW_NUMBER
):
;WITH NumberedMonitoring as (
SELECT RecordID,UnitID, EventDate, ...
ROW_NUMBER() over (PARTITION BY UnitID ORDER BY EventDate desc) rn
FROM UnitMonitoring
)
SELECT * FROM
UnitList ul
inner join
NumberedMonitoring nm
on
ul.UnitID = nm.UnitID and nm.rn = 1
但是有許多不同的解決方案(上面也可以使用子選擇來完成)。
公用表格表達式(引自上面的鏈接):
公共表表達式(CTE)可以被認為是臨時結果集
也就是說,它允許您先寫一些查詢。 在這種情況下,我正在使用它,因為我想對行進行編號(使用ROW_NUMBER函數)。 我告訴它重新開始每個UnitID( PARTITION BY UnitID
)的編號,並且在每個單元ID中,我想要根據EventDate降序編號的行( ORDER BY EventDate desc
)。 這意味着接收第1行(在每個UnitID分區內)的行是最新的行。
在下面的選擇中,我能夠將我的CTE( NumberedMonitoring
)視為任何其他表格。 所以我只是將它加入UnitList表,並確保作為連接條件的一部分,我只選擇行號1( rn = 1
)
SELECT a.UnitID, a.Name, MAX(b.EventDate)
FROM UnitInfo a
INNER JOIN UnitMonitoring b
WHERE a.UnitID IN (SELECT UnitID FROM UnitList)
GROUP BY a.UnitID, a.Name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.