2017-07-21 5 views
0

あるテーブルのスクラップレコードを、マシン上で同時に実行されているマテリアルを示すレコードと照合する必要があります。私はスクラップの数とマシン上の材料が変更されるたびに記録を持つテーブルを備えたテーブルを持っています。日付範囲でレコードを結合する方法

私は下に簡略化されたバージョンが含まれますが、大規模なデータセットに適用すると非常に遅いという動作確認クエリがあります。私はOracleの分析機能の1つを高速化するために試してみたいですが、どのように把握できないのでしょうか。私はFIRST_VALUEとROW_NUMBERをいくつかの異なる形式で試しましたが、正しく取得できませんでした。提案を探しています。

詳細をご希望の場合はお知らせください。

スクラップ測定値テーブル(〜41メートルの行)

  • マシン
  • ScrapReasonCode
  • ScrapQuantity
  • ReportTime

次の表の単純化したバージョンですの

素材番号(〜3メートルの行)

  • マシン
  • 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) 

答えて

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 
+0

私はスクラップレコードのReportTimeの前に最新のMEASUREMENT_TIMESTAMPが必要です。 –

+0

編集が取得しようとしているものかどうかを確認します。 –

+0

私はそれを働かせることができました。 :) –

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の場合は、<=の符号を上記のクエリの<の符号に変更するだけで済みます。

+0

ありがとうございました。私は勉強を続けるつもりですが、私はこの方法を働かせる方法を理解できないようです。おそらく私の欠点です。 :) –

関連する問題