Netezza SQL:用最近的数据填充缺失值

Posted

技术标签:

【中文标题】Netezza SQL:用最近的数据填充缺失值【英文标题】:Netezza SQL: Fill missing values with most recent datum 【发布时间】:2014-01-26 08:00:48 【问题描述】:

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

表 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 中仅使用连接来实现。

我一直找不到方法,但感觉巧妙地使用加入是可能的。

非常感谢您的宝贵时间。

【问题讨论】:

我不清楚表 X 中的缺失值是什么意思。在查询结果中,似乎对于表 x 中不存在的每一天,您都想填写一条记录(多条记录) ) 缺少一天。如果这些记录也出现在表 X 2013-01-01 zap2013-02-14 bip 中,您希望您的结果如何? 我们将查询结果称为 Y。Y 将包含所有日期的值。如果 X 包含给定日期的记录(例如,上面的“2013-01-06”、“foo”),那么我希望 Y 简单地复制该记录。但是如果 X 不包含给定日期的记录(例如上面的“2013-01-07”),我希望注入与 X 中最近的过去记录相对应的值,在这种情况下为 2013-01 -06 -> 富。但是,在 X 中缺少的日期是 2013-01-09 的情况下,最近的值是 bar(在 2013-01-08 上),因此在这种情况下会注入 bar。 【参考方案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

【讨论】:

太棒了,谢谢!我将在今天实施并报告。

以上是关于Netezza SQL:用最近的数据填充缺失值的主要内容,如果未能解决你的问题,请参考以下文章

R语言-均值填充缺失值

用之前的非缺失值填充缺失的 pandas 数据,按 key 分组

python 特征缺失值填充

用分布填充缺失值

机器学习sklearn----用随机森林来填充缺失值

pandas(12):数据清洗(缺失值)