Предположим, что у меня есть таблица с тремя столбцами:
- Идентификатор события (ПК)
- Название тэга
- ТегЗначение
Мне нужно создать запрос, который приводит к чему-то вроде:
- Идентификатор события
- Название тэга
- ТегЗначение
- Тег предыдущего состояния
- ПредыдущееУсловиеЗначение
Где PreviousConditionTag/Value берется из TagName и TagValue предыдущей строки (при упорядочении по EventID).
В более простой версии этой проблемы PreviousConditionTag всегда был таким же, как TagName, то есть мне нужно было получить только предыдущее значение для текущего TagName. Я решил это, используя аналитическую функцию Oracle LAG, разбивая по TagName.
Однако теперь мне нужно выполнить что-то подобное, но для случаев, когда PreviousConditionTag является произвольным тегом, связанным с TagName другой таблицей, где связь между TagName и PreviousConditionTag не является однозначной.
Например, если данная строка имеет TagName «ABC», таблица отношений может сказать, что мне нужно найти предыдущее значение либо «IJK», либо «XYZ».
Я смог придумать эту логику в функции Oracle, которая выполняет SELECT для той же таблицы и ищет MAX(EventID), который соответствует критериям. Например:
SELECT * FROM MyTable WHERE EventID = (
SELECT MAX(EventID) FROM MyTable WHERE TagName IN (
SELECT ConditionTagName FROM ConditionMappingTable WHERE TagName = [CurrentTagName]
)
) AND EventID <= [CurrentEventId]
Однако, как вы понимаете, поскольку этот запрос выполняется в функции для каждой строки MyTable, меня беспокоит его производительность.
Я пытался придумать способ снова использовать аналитику Oracle LAG, но я не был уверен, как придумать для нее предложение PARTITION, так как кажется, что разделы перекрываются. (например, тег ABC должен учитывать IJK и XYZ, а тег DEF должен учитывать IJK и UVW)
Любые идеи?