如何按日期范围

时间:2017-07-21 19:58:38

标签: sql oracle

我需要将一个表中的废品记录与指示机器上同时运行的材料的记录进行匹配。我有一张带有废料计数的表格和一张表格,其中显示了在机器上更换材料时的记录。

我有一个工作查询,我将在下面包含一个简化版本,但是当应用于大型数据集时它非常慢。我想尝试一下Oracle的分析功能,使其更快,但我无法弄清楚如何。我尝试了几种不同形式的FIRST_VALUE和ROW_NUMBER,但我无法将它们弄好。寻找任何建议。

如果您想了解更多详情,请与我们联系。

以下是表格的简化版本:

废料读数表(约41米行)

  • ScrapReasonCode
  • ScrapQuantity
  • ReportTime

材料编号(~3m行)

  • MaterialNumber
  • MEASUREMENT_TIMESTAMP


  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)

2 个答案:

答案 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>