У нас есть запрос Oracle SQL для идентификации записей, в которых значение столбца таблицы изменилось с одной записи на другую. Соответствующие столбцы (ID, SOME_COLUMN, FROM_DATE, TO_DATE), где идентификатор не является уникальным, и 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)
т.д.
Мы могли бы реализовать это с помощью следующего автообъединения
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
однако поскольку таблица содержит 100 миллионов записей, это довольно поражает производительность. Есть ли более эффективный способ сделать это? Кто-то намекнул на аналитические функции (например, LAG), но пока мы не смогли найти рабочего решения. Любые идеи будут оценены
Ваш вопрос непонятен. Ваши даты не пересекаются вообще, и неясно, какие результаты вы хотите. –
Даты действительно не перекрываются, они представляют временные интервалы, в течение которых эффективна определенная строка таблицы, принадлежащая этому идентификатору. Как вы видите в примере, FROM_DATE интервала всегда добавляется +1 к TO_DATE предыдущего интервала. Нам нужны результаты, когда значение SOME_COLUMN изменилось с одного интервала на другой. Фактически, проверяя ваш ответ ниже, вы, кажется, правильно все интерпретировали. – hammerfest