DB2中使用ROW_NUMBER() OVER(PARTITION BY)报错:聚合/OLAP函数使用无效
问题原因
DB2 不允许在 WHERE 子句中直接使用窗口函数(比如 ROW_NUMBER() OVER())。这是因为SQL语句的执行顺序是先处理 FROM 和 WHERE 子句,再计算窗口函数。当执行 WHERE 时,窗口函数的结果还未生成,因此会触发 SQL0120N 错误。
解决方案
根据你的需求(获取每个 KUNDE_PART_REF 的唯一行),有两种简洁的处理方式:
方式一:用子查询/CTE 包裹窗口函数
把窗口函数的计算放到子查询或CTE中,再在外层过滤行号:
-- 子查询写法 SELECT KUNDE_PART_REF FROM ( SELECT KUNDE_PART_REF, ROW_NUMBER() OVER(PARTITION BY KUNDE_PART_REF ORDER BY KUNDE_PART_REF) AS rn FROM G00V.G79_KUNDE_KONTAKT_INFO_NL_CBT ) AS sub WHERE rn = 1; -- CTE写法(DB2支持) WITH ranked_data AS ( SELECT KUNDE_PART_REF, ROW_NUMBER() OVER(PARTITION BY KUNDE_PART_REF ORDER BY KUNDE_PART_REF) AS rn FROM G00V.G79_KUNDE_KONTAKT_INFO_NL_CBT ) SELECT KUNDE_PART_REF FROM ranked_data WHERE rn = 1;
方式二:用 DISTINCT 简化查询
因为你的分区和排序字段都是 KUNDE_PART_REF,本质上就是要获取该字段的唯一值,用 DISTINCT 更高效:
SELECT DISTINCT KUNDE_PART_REF FROM G00V.G79_KUNDE_KONTAKT_INFO_NL_CBT;
内容的提问来源于stack exchange,提问作者Berit Larsen
相关产品推荐
相关产品推荐

