Oracle SQL, заполните пропущенное значение ближайшим не пропущенным - PullRequest
1 голос
/ 08 июля 2019

У меня есть набор данных, в котором я хочу заполнить пропущенные значения ближайшим непропущенным значением. Я нашел два элегантных решения в ответах на этот вопрос, но я не понимаю, почему они не работают для меня.

Таблица:

create table Tab1(data date, V1 number);
insert into Tab1 values (date '2000-01-01', 1);
insert into Tab1 values (date '2000-02-01', 1);
insert into Tab1 values (date '2000-03-01', 1);
insert into Tab1 values (date '2000-04-01', 1);
insert into Tab1 values (date '2000-05-01', NULL);
insert into Tab1 values (date '2000-06-01', NULL);
insert into Tab1 values (date '2000-03-01', 2);
insert into Tab1 values (date '2000-04-01', 2);
insert into Tab1 values (date '2000-05-01', NULL);
insert into Tab1 values (date '2000-06-01', NULL);
select * from Tab1;

DATA       V1
2000-01-01  1
2000-02-01  1
2000-03-01  1
2000-04-01  1
2000-05-01  
2000-06-01  
2000-03-01  2
2000-04-01  2
2000-05-01  
2000-06-01  

Попытка № 1:

select A.*, 
    (case when V1 is null then lag(V1 ignore nulls)  
               over (partition by V1 order by V1, data) 
          else V1 
          end) V2
 from Tab1 A;

Попытка № 2:

select A.*, 
    (case when V1 is null 
               then last_value(V1 ignore nulls)
               over (partition by V1 order by data 
               range between unbounded preceding and 1 preceding)  
          else V1 
          end) V2
 from Tab1 A;

Оба дают мне один и тот же нежелательный результат:

DATA       V1   V2
2000-01-01  1   1
2000-02-01  1   1
2000-03-01  1   1
2000-04-01  1   1
2000-03-01  2   2
2000-04-01  2   2
2000-05-01      
2000-05-01      
2000-06-01      

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Ваша первая версия должна работать, с небольшим изменением:

select A.*, 
       coalesce(V1, lag(V1 ignore nulls)  over (order by data)) V2
from Tab1 A;

Настройка - удалить partition by v1 из lag().coalesce() - это мое предпочтение для более простых выражений.

Тот же твик должен работать и для второй версии.

Ваша версия не работает, поскольку должно прийти значение lag()из того же раздела (или быть null).Если у вас есть partition by v1, вы на самом деле гарантируете, что v1 имеет то же значение, что и в текущей строке.

0 голосов
/ 13 июля 2019

Привет, или вы можете попробовать вручную создать решение игнорирования нуля, см. Ниже. спасибо https://stackoverflow.com/a/57016373/10562099

  1. Вам необходимо использовать столбец 0/1, чтобы указать нулевые / ненулевые данные
  2. Затем создайте сводный столбец накопления, чтобы рассчитать номер индикатора на шаге 1. -Теперь вы можете видеть, что данные уже выглядят как сгруппированные по вашим ненулевым данным.
  3. В качестве последнего шага, пожалуйста, используйте группу функций Max по сумме накопления (на шаге 2), чтобы заполнить данные (здесь нет) в пустых элементах.
...