テーブル列の値があるレコードから別のレコードに変更されたレコードを識別するOracle SQLクエリがあります。関連する列は、(ID、SOME_COLUMN、FROM_DATE、TO_DATE)IDが一意でない、そしてFROM_DATEとTO_DATEは、そのIDのために特定の行が有効であったインターバルする時間を決定する、すなわち自己結合Oracle SQLクエリをLAG/LEAD分析関数で最適化しますか?
(ID1, VAL1, 01/01/2016, 03/01/2016)
(ID1, VAL2, 04/01/2016, 09/01/2016)
(ID1, VAL3, 10/01/2016, 19/01/2016)
等です
我々は、テーブルのレコードの100百万人が含まれているので、それはかなりのパフォーマンスを打つ、次の自己結合が
SELECT N.ID
O.SOME_COLUMN OLD_VALUE,
N.SOME_COLUMN NEW_VALUE
FROM OUR_TABLE N, OUR_TABLE O
WHERE N.ID = O.ID
AND N.FROM_DATE - 1 = O.TO_DATE
AND N.SOME_COLUMN <> O.SOME_COLUMN
を使ってこれを実装することができます。これを行うより効果的な方法はありますか?誰かが分析機能(LAGなど)を暗示していましたが、これまでのところ解決策を見つけられませんでした。すべてのアイデアは、はい、あなたは最後の値を取得するためにLEAD()
を使用することができます
質問が不明です。あなたの日付はまったく重複しないので、あなたが望む結果が不明です。 –
日付は実際には重複していません。時間間隔を表しており、その間にそのIDに属する特定のテーブル行が有効です。この例でわかるように、区間のFROM_DATEは、前の区間のTO_DATEに常に+1されます。 SOME_COLUMNの値が1つのインターバルから別のインターバルに変更された結果が必要です。実際にあなたの下の答えをチェックすることは、すべてを正しく解釈したようです。 – hammerfest