Я пытаюсь решить проблему трендов при работе, очень похожей на приведенный ниже пример. Я думаю, что у меня есть метод, но я не знаю, как это сделать в SQL.Oracle SQL Trending MTD Data
Входные данные:
MTD LOC_ID RAINED
1-Apr-16 1 Y
1-Apr-16 2 N
1-May-16 1 N
1-May-16 2 N
1-Jun-16 1 N
1-Jun-16 2 N
1-Jul-16 1 Y
1-Jul-16 2 N
1-Aug-16 1 N
1-Aug-16 2 Y
Нужный выход:
MTD LOC_ID RAINED TRENDS
1-Apr-16 1 Y New
1-May-16 1 N No Rain
1-Jun-16 1 N No Rain
1-Jul-16 1 Y Carryover
1-Aug-16 1 N No Rain
1-Apr-16 2 N No Rain
1-May-16 2 N No Rain
1-Jun-16 2 N No Rain
1-Jul-16 2 N No Rain
1-Aug-16 2 Y New
Я пытаюсь произвести выходной сигнал из входного сигнала, на тренде МПД без зависимости Это. Таким образом, когда на вход добавляются новые месяцы, выход изменяется без редактирования запроса.
Логика для ТРЕНДОВ будет происходить на каждом уникальном LOC_ID. Тенденции будут иметь три значения: «Новый» в течение первого месяца RAINED - «Y», «Carryover» в последующие месяцы, когда RAINED «Y» и «No Rain» в любые месяцы, где RAINED «N».
Я хотел бы автоматизировать эту проблему, введя промежуточный шаг со списком. Например, для LOC_ID = «1»:
MTD LOC_ID RAINED PREV_RAINED
1-Apr-16 1 Y (null)/0/(I don't care)
1-May-16 1 N Y
1-Jun-16 1 N Y;N
1-Jul-16 1 Y Y;N;N
1-Aug-16 1 N Y;N;N;Y
Таким образом, для получения «Тренды» в выводе, я могу сказать:
case when RAINED = 'Y' then
case when not regexp_like(PREV_RAINED, 'Y', 'i') then
'New'
else
'Carryover'
end
else
'No Rain'
end as TRENDS
Моя проблема в том, что я не знаю, как для создания PREV_RAINED для каждого уникального LOC_ID. У меня есть ощущение, что ему нужно комбинировать LAG() и раздел по порядку LOC_ID по MTD, но количество лаг, которое мне нужно сделать, зависит от каждого месяца.
Есть ли простой способ произвести PREV_RAINED или более простой способ решить мою общую проблему при сохранении автоматизации каждый месяц?
Спасибо за чтение всего этого! :)
В примере, является ли тенденция для loc_id = 2 правильной? он шел в мае, но не в апреле, поэтому я ожидал нового в мае. Я ошибаюсь? – Aleksej
Какая версия Oracle?В 12c вы можете использовать MATCH_RECOGNIZE. – mathguy
@Aleksej Вы правы, но я испортил ввод в моем примере. Я отредактировал его правильно. –