Возьмите предыдущие результаты и добавьте в строку

#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