Wir haben eine Oracle SQL-Abfrage, um Datensätze zu identifizieren, bei denen sich der Wert einer Tabellenspalte von einem Datensatz zu einem anderen geändert hat. Relevant Spalten (ID, SOME_COLUMN, FROM_DATE, TO_DATE) wenn die ID nicht eindeutig ist, und FROM_DATE TO_DATE und das Zeitintervall bestimmen, für die den die spezielle Zeile für diese ID wirksam war, dhOptimierung der Self-Join-Oracle-SQL-Abfrage mit LAG/LEAD-Analysefunktionen?
(ID1, VAL1, 01/01/2016, 03/01/2016)
(ID1, VAL2, 04/01/2016, 09/01/2016)
(ID1, VAL3, 10/01/2016, 19/01/2016)
usw.
Wir konnten dies mit dem folgenden implementieren Selbst beitreten
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
aber da die Tabelle 100 Millionen Datensätze enthält, ist es durchaus die Leistung trifft. Gibt es einen effektiveren Weg, dies zu tun? Jemand hat analytische Funktionen (z. B. LAG) angedeutet, aber wir konnten bisher keine funktionierende Lösung finden. Alle mögliche Ideen
Ihre Frage ist nicht klar. Ihre Daten überschneiden sich überhaupt nicht und es ist unklar, welche Ergebnisse Sie wünschen. –
Daten überlappen sich tatsächlich nicht, sie stellen Zeitintervalle dar, in denen die zu dieser ID gehörende bestimmte Tabellenzeile wirksam war. Wie Sie im Beispiel sehen, wird das FROM_DATE eines Intervalls immer +1 zum TO_DATE des vorherigen Intervalls hinzugefügt. Wir benötigen Ergebnisse, bei denen sich der Wert von SOME_COLUMN von Intervall zu Intervall geändert hat. Wenn Sie Ihre Antwort unten überprüfen, scheinen Sie alles richtig interpretiert zu haben. – hammerfest