簡體   English   中英

SQL Server查詢。 按最新日期加入

[英]SQL Server query. JOIN by latest date

我有3張桌子:

UnitInfo(UnitID, ...), 
UnitList(UnitID, ...) 
UnitMonitoring(RecordID,UnitID, EventDate, ...)

UnitList的一個子集UnitInfo (在數據方面和在列方面)。 UnitMonitoring接收記錄的時間有關的時間UnitList (每一個UnitIDUnitMonitoring我們會有多條記錄)灌裝EventDate UnitInfo已擴展信息)。

我想不出如何建立一個查詢,以便對每一個UnitIDUnitList我得到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM