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