2015-06-08 2 views
0

Я пытаюсь сделать UPDATE таблицу и заменить значения NULL, но с определенными условиями. Я привел пример ниже и закажу его в случаях, чтобы помочь проиллюстрировать, где мои условия применяются.Oracle sql-replace null со следующим и p

1º - В случае, если есть значение NULL, оно должно заменить прежним известным значением. (CASE 1-3)

2º - При наличии двух последовательных NULL и ID изменений. Я ожидаю, что он заберет предыдущее известное значение от ID 5 и следующее от ID 6, независимо от того, что DATE. (CASE 4-5)

ID  DATE  HOUR VAL  CASE 
-- ---------- ----- -------  ------ 
5 2015.03.29 16 15.45   1 
5 2015.03.30 13 NULL   2 
5 2015.03.30 14 33.45   3 
5 2015.03.31 15 NULL   4 
6 2015.02.27 03 NULL   5 
6 2015.02.27 04 76.77   6 

Вот как это должно выглядеть так:

ID  DATE  HOUR VAL  CASE 
-- ---------- ----- -------  ------ 
5 2015.03.29 16 15.45   1 
5 2015.03.30 13 15.45   2 
5 2015.03.30 14 33.45   3 
5 2015.03.31 15 33.45   4 
6 2015.02.27 03 76.77   5 
6 2015.02.27 04 76.77   6 

я уже успел сделать свое 1º состояние, хотя я не могу видеть, как я собираюсь реализовать CASE 4-5. Я пробовал так много способов, и я не понимаю, как это сделать.

Несмотря на то, что я делаю в UPDATE здесь, в случае, если кто-то знает, как это сделать с помощью только SELECT, я могу экспортировать результаты, а затем INSERT его снова, но если вы можете добавить в этот запрос я ценю. Спасибо за любую помощь!

MERGE INTO DADOS t1 
USING (
    SELECT rowid rd, "ID", "DATE", "HOUR", 
      last_value("VAL" ignore nulls) 
      OVER (order by "DATE" 
       rows between unbounded preceding and current row 
      ) as newVAL 
    FROM DADOS 
) x 
ON (t1.rowid = x.rd) 
WHEN MATCHED THEN UPDATE SET t1."VAL" = x.newVAL; 

ответ

1

Вы можете использовать что-то вроде этого запроса в вашем merge заявлении, она производила желаемый результат:

select id, tdate, hour, coalesce(val, v1, v2) val 
    from (
    select id, tdate, hour, val, 
     lag (val ignore nulls) over (partition by id order by tdate, hour) v1, 
     lead(val ignore nulls) over (partition by id order by tdate, hour) v2 
     from dados) 
    order by id, tdate, hour 

SQLFiddle

+0

Да она работала, спасибо очень много !! – Zalif

Смежные вопросы