Netezza SQL:使用最新数据填充缺失值

时间:2014-01-26 08:00:49

标签: sql netezza

我需要从任意日期(但已排序)系列中选择数据,以便将值填充到每日日期表中,其中缺失值由最近日期的源值填充。这是一个例子:

表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 个答案:

答案 0 :(得分: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