Netezza SQL: заполнить пропущенные значения самыми последними данными
Мне нужно выбрать данные из произвольно датированной (но отсортированной) серии, чтобы значения заполнялись в ежедневную таблицу с датами, где отсутствующие значения заполняются исходным значением для самой последней даты. Вот пример:
Таблица X:
2013-01-06 foo
2013-01-08 bar
Я хотел бы запрос к таблице X такой, что результат имеет вид:
2013-01-06 foo
2013-01-07 foo
2013-01-08 bar
2013-01-09 bar
ОДНАКО: мне нужно сделать это без использования коррелированного подзапроса (он предназначен для использования на коробке IBM Netezza). Я мог бы пойти на проблему написания пользовательской функции... Но прежде чем сделать это, я хотел знать, можно ли этого достичь в vanilla SQL, используя только объединения.
Я не смог найти способ, но у меня есть ощущение, что это возможно при умном использовании присоединения.
Большое спасибо за ваше время.
1 ответ
Вы можете решить это разными способами. Если вы избегаете хранимых процедур. Я бы начал с создания временной таблицы с тем количеством строк, которое вы хотите.
create temp table temp_seq as
select hw_hwid as any_list
from _v_disk
distribute on random;
Затем я использовал бы его, чтобы сгенерировать ваш список перекрестных соединений дат со списком foo и bar, чтобы получить ожидаемую таблицу. После всего, что осталось, присоединиться к table X
SELECT sub_list.seq_dt,
sub_list.foo_bar,
nvl2(table_x.foo_bar,1,0) AS present_in_tblx
FROM (
SELECT seq.seq_dt,
test_data.foo_bar
FROM (
SELECT row_number() over(
ORDER BY rowid) AS temp_seq
,
to_date('2013-01-01','YYYY-MM-DD') AS start_dt
,
start_dt+temp_seq-1 AS seq_dt
FROM temp_seq) seq cross join
(SELECT 'foo' AS foo_bar
UNION ALL
SELECT 'bar') test_data) sub_list left outer join
(SELECT date('2013-01-06') AS xdate,
'foo' AS foo_bar
UNION ALL
SELECT date('2013-01-08'), 'bar') table_x
ON sub_list.seq_dt=table_x.xdate and sub_list.foo_bar=table_x.foo_bar
order by sub_list.seq_dt