我正在尝试将string_agg用作一列,但同时对该列进行排序,并且仅显示唯一值。考虑以下演示。是否存在语法问题,或者使用我使用的方法根本不可能做到这一点?
kill $(lsof -t -i:portnumber)
[2019-11-22 13:29:32] [42P10]错误:在具有DISTINCT的聚合中,ORDER BY表达式必须出现在参数列表中 [2019-11-22 13:29:32]位置:53
答案 0 :(得分:2)
错误消息很清楚。您在ORDER BY
子句中使用的表达式也必须出现在聚合部分中。
您可以这样做:
SELECT STRING_AGG(DISTINCT foo.a::TEXT, ',' ORDER BY foo.a::TEXT DESC)
FROM (
SELECT 1 As a
UNION ALL SELECT 1
UNION ALL SELECT 1
UNION ALL SELECT 2
) AS foo
虽然这将起作用,但此解决方案的问题在于它将数字作为字符串排序,但没有相同的排序规则。从字符串的角度来看,10
小于2
。
另一种选择是使用数组:首先,ARRAY_AGG()
可用于聚合数字(以正确的数字顺序),然后可以将其转换为逗号分隔的字符串列表,{{1} }。
ARRAY_TO_STRING()