小编典典

通过聚合函数中其他列(的第一个值)对不同的列值进行排序

sql

我正在尝试根据另一列的值来排序一些不同的聚合文本的输出顺序,如下所示:

string_agg(DISTINCT sometext, ' ' ORDER BY numval)

但是,这会导致错误:

错误:在具有DISTINCT的聚合中,ORDER BY表达式必须出现在参数列表中

我确实理解为什么会这样,因为如果numval两个重复值中的一个不同,而另一个位于中间,则排序将是“不确定的” 。

理想情况下,我想按首次出现/最低的顺序对它们进行排序,但是在我的数据中,定义不清的情况实际上很少见(我通常希望使用它来消除顺序重复的值DISTINCT),最终我不必特别在意它们的顺序,并且会对MySQL这样的东西感到满意,GROUP_CONCAT(DISTINCT sometext ORDER BY numval SEPARATOR ' ')尽管它草率地工作了。

我希望有必要使用一些Postgres柔和的方法,但是我真的不知道最有效/简洁的方法是什么。


阅读 181

收藏
2021-03-17

共1个答案

小编典典

如果这是较大表达式的一部分,则select distinct在子查询中执行a可能会很不方便。在这种情况下,您可以利用string_agg()忽略NULL输入值的事实,并执行类似的操作:

select string_agg( (case when seqnum = 1 then sometext end) order by numval)
from (select sometext, row_number() over (partition by <whatever>, sometext order by numval) as seqnum
      from t
     ) t
group by <whatever>

子查询添加一列,但不需要汇总数据。

2021-03-17