#sql #oracle #lag #lead
#sql #Oracle #отставание #привести
Вопрос:
У меня есть результаты в таблице ниже.
Критерии:
Разделите по CUSTID и ITEMID, где end_dt не равно null, если соответствующий столбец равен null, затем возьмите последнее значение, содержащее запись.
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
Ожидаемые результаты:
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
Единственная строка, которая меняется, это
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
Эта строка не должна меняться, это правильно:
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
Ответ №1:
Вы должны проверить три вещи: resp равно null, end_dt не равно null и, если это последняя строка для этого custid, itemid . Только в этом случае используйте last_value , как здесь, столбец resp2
:
select custid, itemid, start_dt, end_dt, resp, start_cycle, end_cycle,
case when resp is null
and end_dt is not null
and lead(itemid) over (partition by custid, itemid order by start_cycle) is null
then last_value(resp) ignore nulls
over (partition by custid, itemid order by start_cycle)
else resp
end resp2
from t