Netezza SQL:替换每个名称对应的最后一个空值年份
解决Netezza中UPDATE无法使用窗口函数的问题,替换NULL年份为逻辑年份
针对你遇到的Netezza不允许在UPDATE中使用窗口函数的问题,这里提供两种可行的解决方案,实现将每个name对应的最后一条NULL年份替换为最大非空年份+1的需求:
方案一:使用CTE预计算最大年份后关联更新
先通过CTE统计每个name的最大非空年份,再关联原表进行更新:
WITH name_max_year AS ( SELECT name, MAX(year) AS max_year FROM MY_TABLE WHERE year IS NOT NULL GROUP BY name ) UPDATE MY_TABLE t SET year = n.max_year + 1 FROM name_max_year n WHERE t.name = n.name AND t.year IS NULL;
方案二:使用子查询直接赋值
无需CTE,直接在UPDATE的SET子句中通过子查询获取对应name的目标年份:
UPDATE MY_TABLE t SET year = (SELECT MAX(year) + 1 FROM MY_TABLE WHERE name = t.name AND year IS NOT NULL) WHERE t.year IS NULL;
验证结果
执行上述任一更新语句后,执行查询验证结果:
SELECT * FROM MY_TABLE ORDER BY name, year;
将得到符合需求的输出:
name year 1 aaa 2010 2 aaa 2011 3 aaa 2012 4 aaa 2013 5 aaa 2014 6 bbb 2000 7 bbb 2001 8 bbb 2002 9 bbb 2003 10 bbb 2004
说明
Netezza的UPDATE语法限制了窗口函数的直接使用,因此需要通过预聚合(CTE或子查询)的方式先计算出每个分组的目标值,再关联更新NULL记录。由于你场景中每个name仅存在一条NULL年份记录,上述两种方案都能高效完成需求。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

