[英]Return Most Recent Record group by 2 ID fields
我需要顯示零件的當前狀態(“已批准”或“未批准”) 我將狀態表設置為 MaterialNo、ToolID、Status、Asofdate
我的想法是我可能有幾個工具被批准,而幾個沒有被批准。 我希望能夠看到每個工具的最新狀態,但我不想看到歷史狀態。
已嘗試使用 MAX(Asofdate) 並按 MaterialNo、ToolID 和 Status 分組,但它會返回每個的所有狀態歷史記錄。
SELECT MaterialNo, ToolID, PPAPStatus, MAX(Asof) as "AsOf"
FROM [MfgDataCollector].[dbo].[PPAPStatus]
Group By MaterialNo, ToolID, PPAPStatus
狀態表有以下數據:
MaterialNo ToolID Status Asofdate
52748677 1 Not approved 2019-10-10
52748677 1 approved 2019-10-13
52748677 2 approved 2019-10-14
我想看看:
MaterialNo ToolID Status Asofdate
52748677 1 approved 2019-10-13
52748677 2 approved 2019-10-14
通常具有非常好的性能的一種解決方案是相關子查詢:
select p.*
from [MfgDataCollector].[dbo].[PPAPStatus] p
where p.asof = (select max(p2.asof)
from [MfgDataCollector].[dbo].[PPAPStatus] p2
where p2.MaterialNo = p.MaterialNo and
p2.ToolID = p.ToolID
);
為了獲得最佳性能,您需要(MaterialNo, ToolID, asof)
上的索引。
我喜歡在這里使用帶有TOP 1 WITH TIES
技巧的ROW_NUMBER
:
SELECT TOP 1 WITH TIES MaterialNo, ToolID, Status, Asofdate
FROM [MfgDataCollector].[dbo].[PPAPStatus]
ORDER BY ROW_NUMBER() OVER (PARTITION BY MaterialNo, ToolID ORDER BY Asofdate DESC);
最好的選擇是 row_number()
Select MaterialNo, ToolID,
PPAPStatus,AsofNow from (Select
MaterialNo, ToolID,
PPAPStatus,AsofNow, row_number()
over
(partition
by MaterialNo, ToolId, PPAStatus
order by
AsofNow desc) rn
FROM [MfgDataCollector].[dbo].
[PPAPStatus]
) t where t.rn=1
根據您的要求,請在下面查詢,需要您的幫助。
;WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER(PARTITION BY MaterialNo,ToolID ORDER BY Asofdate DESC) AS ROWNM
FROM [MfgDataCollector].[dbo].[PPAPStatus]
)
SELECT * FROM CTE WHERE ROWNM=1
最好的選擇是ROW_NUMBER()沒有更復雜的邏輯,可以輕松按字段進行分區。
請在下面的查詢中找到要求。
;WITH CTE AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY MaterialNo,ToolID ORDER BY Asofdate DESC) AS ROWNM
FROM [MfgDataCollector].[dbo].[PPAPStatus]
)
SELECT * FROM CTE WHERE ROWNM=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.