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
Другие вопросы по тегам