按2个ID字段返回“最近记录”组

时间:2019-10-14 14:27:01

标签: sql sql-server

我需要显示零件的当前状态(“已批准”或“未批准”) 我将状态表设置为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

4 个答案:

答案 0 :(得分:4)

一种通常具有非常好的性能的解决方案是相关子查询:

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)上建立索引。

答案 1 :(得分:3)

我喜欢在这里将ROW_NUMBERTOP 1 WITH TIES一起使用:

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);

答案 2 :(得分:2)

最好的选择是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

答案 3 :(得分:0)

最好的选择是 ROW_NUMBER(),不再需要复杂的逻辑,并且可以轻松按字段进行分区。

请根据需要在下面的查询中查找。

else:
    for x in listB:
        print(x[0])