Nous avons une requête SQL Oracle pour identifier les enregistrements où la valeur d'une colonne de table a changé d'un enregistrement à l'autre. colonnes correspondantes sont (ID, some_column, FROM_DATE, TO_DATE) lorsque l'ID est pas unique, et FROM_DATE et TO_DATE déterminer l'intervalle de temps pendant lequel le rang particulier pour cet ID a été efficace, c.-à-Optimiser la requête Oracle SQL auto-jointe avec les fonctions analytiques 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)
etc.
Nous pourrions mettre en œuvre ce qui suit en utilisant le autojointure
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
cependant, puisque la table contient 100 millions d'enregistrements, il frappe tout à fait la performance. Existe-t-il un moyen plus efficace de le faire? Quelqu'un a fait allusion à des fonctions analytiques (par exemple, LAG), mais nous n'avons pas pu trouver de solution de travail jusqu'à présent. Toutes les idées seraient appréciées
Votre question n'est pas claire. Vos dates ne se chevauchent pas du tout, et on ne sait pas quels résultats vous voulez. –
Les dates ne chevauchent en effet pas, elles représentent des intervalles de temps, au cours desquels la ligne de table particulière appartenant à cet ID était efficace. Comme vous le voyez dans l'exemple, le FROM_DATE d'un intervalle est toujours +1 ajouté au TO_DATE de l'intervalle précédent. Nous avons besoin de résultats, où la valeur de SOME_COLUMN a changé d'un intervalle à l'autre. En fait vérifier votre réponse ci-dessous vous semble avoir tout interprété correctement. – hammerfest