Вопрос для начинающих.
Предпосылка : я понял, что здесь ключевой вопрос заключается в том, что в таблице SQL нет внутреннего порядка, поэтому для «добавления» столбцак таблице я должен указать какой-то ключ для соответствия.Тем не менее, я ищу элегантное решение.
Проблема : я хочу заменить значения столбца V1
преобразованием V1
, полученным через оконную функцию (котораяЯ использую, чтобы заполнить NULL
значения ближайшим известным значением V1
, упорядочив по data
).
Пример набора данных (обратите внимание, у меня нет ключа для идентификации строк):
create table Tab1(data date, V1 number, val number);
insert into Tab1 values (date '2000-01-01', 1, 100);
insert into Tab1 values (date '2000-02-01', 1, 110);
insert into Tab1 values (date '2000-03-01', 1, 100);
insert into Tab1 values (date '2000-03-01', 1, 130);
insert into Tab1 values (date '2000-05-01', NULL, 100);
insert into Tab1 values (date '2000-06-01', NULL, 100);
insert into Tab1 values (date '2000-03-01', 2, 110);
insert into Tab1 values (date '2000-03-01', 2, 105);
insert into Tab1 values (date '2000-04-01', 2, 190);
insert into Tab1 values (date '2000-05-01', NULL, 200);
insert into Tab1 values (date '2000-06-01', NULL, 150);
select * from Tab1;
DATA V1 val
2000-01-01 1 100
2000-02-01 1 110
2000-03-01 1 100
2000-03-01 1 130
2000-04-01 1 100
2000-05-01 100
2000-06-01 100
2000-03-01 2 110
2000-03-01 2 105
2000-04-01 2 190
2000-05-01 200
2000-06-01 150
Я хочу избежать создания второй таблицы, как в
create table Tab2 as
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;
На самом деле, оконная функция все еще не выполняет то, что я хочу, но это отдельная проблема (тем не менее, если у вас есть решение, это очень приветствуется).В конце я хочу, чтобы V1 был заменен своей версией с нулями, замененными ближайшими не пропущенными значениями:
DATA V1 val
2000-01-01 1 100
2000-02-01 1 110
2000-03-01 1 100
2000-03-01 1 130
2000-04-01 1 100
2000-05-01 1 100
2000-06-01 1 100
2000-03-01 2 110
2000-03-01 2 105
2000-04-01 2 190
2000-05-01 2 200
2000-06-01 2 150
Я не могу использовать update
, поскольку функции Windows не допускаютсяи подзапрос с функцией windows извлечет несколько строк.
Аналогично, оператор merge into
не будет работать, так как я не могу дать условие on
, которое идентифицирует одну строку для сопоставления (data
и V1
не достаточно).
Есть ли способ просто "добавить" V2
к Tab1
без необходимости создавать новую таблицу?