繁体   English   中英

按 2 个 ID 字段返回最新记录组

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM