Db2中LISTAGG(DISTINCT)搭配ORDER BY报错,求替代排序方案
Db2 v11.5.7.0中LISTAGG(DISTINCT)的ORDER BY合法替代表达式
在Db2 v11.5.7.0环境中,使用LISTAGG(DISTINCT)时,ORDER BY子句的表达式必须与去重后的聚合字段直接关联,且满足Db2的语法约束。以下是除字段本身外的合法替代表达式类型:
去重字段的确定性标量函数转换:使用对去重字段的确定性转换函数,只要函数结果与去重字段一一对应即可。例如:
SELECT listagg(DISTINCT x, ',') WITHIN GROUP (ORDER BY CAST(x AS VARCHAR(10))) FROM (VALUES (1), (1), (2)) t (x)类似的还有
ABS(x)(数值类型)、LOWER(x)(字符串类型)等确定性函数。聚合项的位置序号:用数字序号指代
LISTAGG中去重后的字段位置(这里x是第一个参数,用1表示):SELECT listagg(DISTINCT x, ',') WITHIN GROUP (ORDER BY 1) FROM (VALUES (1), (1), (2)) t (x)预先去重后的字段表达式:先通过子查询完成去重,再对去重后的结果使用
LISTAGG,此时ORDER BY可使用任何基于去重字段的合法表达式,灵活性更高:SELECT listagg(x, ',') WITHIN GROUP (ORDER BY x * 2) FROM (SELECT DISTINCT x FROM (VALUES (1), (1), (2)) t (x)) t2
注意事项
- 所有
ORDER BY表达式必须是确定性的,不能使用RAND()这类非确定性函数,否则仍会触发报错。 - 不能引用原表中未去重的其他字段或与去重字段无关的表达式,这也是最初报错的原因——Db2要求
LISTAGG(DISTINCT)的排序逻辑必须基于去重后的聚合项。
内容的提问来源于stack exchange,提问作者Lukas Eder
相关产品推荐
相关产品推荐

