[英]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.