我需要将一个表中的废品记录与指示机器上同时运行的材料的记录进行匹配。我有一张带有废料计数的表格和一张表格,其中显示了在机器上更换材料时的记录。
我有一个工作查询,我将在下面包含一个简化版本,但是当应用于大型数据集时它非常慢。我想尝试一下Oracle的分析功能,使其更快,但我无法弄清楚如何。我尝试了几种不同形式的FIRST_VALUE和ROW_NUMBER,但我无法将它们弄好。寻找任何建议。
如果您想了解更多详情,请与我们联系。
以下是表格的简化版本:
废料读数表(约41米行)
材料编号(~3m行)
SELECT Scrap.Machine,
Scrap.MaterialNumber,
Scrap.ScrapReasonCode,
Scrap.ScrapQuantity,
Scrap.ReportTime
FROM Scrap, Materials
WHERE Scrap.Machine = Materials.Machine
AND Materials.MEASUREMENT_TIMESTAMP =
(SELECT MAX (M2.MEASUREMENT_TIMESTAMP)
FROM Materials M2
WHERE M2.Materials.Machine = Scrap.Machine
AND M2.MEASUREMENT_TIMESTAMP <= Scrap.ReportTime)
答案 0 :(得分:1)
我认为这就是你要做的。您可以使用FIRST_VALUE
窗口功能。
SELECT DISTINCT
s.Machine,
s.MaterialNumber,
s.ScrapReasonCode,
s.ScrapQuantity,
s.ReportTime,
FIRST_VALUE(m.MEASUREMENT_TIMESTAMP) OVER(PARTITION BY s.Machine ORDER BY m.MEASUREMENT_TIMESTAMP DESC)
--or you can use the `MAX` window function too.
--MAX(m.MEASUREMENT_TIMESTAMP) OVER(PARTITION BY s.Machine)
FROM Scrap s
JOIN Materials m
WHERE s.Machine = m.Machine AND m.MEASUREMENT_TIMESTAMP <= s.ReportTime
答案 1 :(得分:0)
我可能误解了您的要求,但我认为以下查询应该在使用ROW_NUMBER
实施方面有效:
SELECT q.*
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Scrap.Machine ORDER BY Materials.MEASUREMENT_TIMESTAMP DESC) AS RNO
Scrap.MaterialNumber,
Scrap.ScrapReasonCode,
Scrap.ScrapQuantity,
Scrap.ReportTime
FROM Scrap, Materials
WHERE Scrap.Machine = Materials.Machine
AND Materials.MEASUREMENT_TIMESTAMP <= Scrap.ReportTime
) q
WHERE q.RNO = 1
编辑:如果您需要Scrap ReportTime之前(而不是之前或之前)的测量时间戳,您只需在上面的查询中将<=
符号更改为<
符号。 / p>