在STRING_AGG函数中使用唯一性和顺序

时间:2019-11-22 18:34:10

标签: sql postgresql group-by

我正在尝试将string_agg用作一列,但同时对该列进行排序,并且仅显示唯一值。考虑以下演示。是否存在语法问题,或者使用我使用的方法根本不可能做到这一点?

kill $(lsof -t -i:portnumber)
  

[2019-11-22 13:29:32] [42P10]错误:在具有DISTINCT的聚合中,ORDER BY表达式必须出现在参数列表中   [2019-11-22 13:29:32]位置:53

1 个答案:

答案 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

Demo on DB Fiddle

虽然这将起作用,但此解决方案的问题在于它将数字作为字符串排序,但没有相同的排序规则。从字符串的角度来看,10小于2

另一种选择是使用数组:首先,ARRAY_AGG()可用于聚合数字(以正确的数字顺序),然​​后可以将其转换为逗号分隔的字符串列表,{{1} }。

ARRAY_TO_STRING()

Demo on DB Fiddle