回答

收藏

在PostgreSQL查询中以降序聚合字符串

技术问答 技术问答 201 人阅读 | 0 人回复 | 2023-09-13

如何按降序对员工进行排序?1 U- k: |# U3 r7 Y+ P3 l4 f! W
我正在使用不支持的PostgreSQL 8.4 string_agg()。我尝试使用以下内容,但不支持此功能:
- @) K, N4 x' k! q- Tarray_to_string(array_agg(employee ORDER BY employee DESC), ',')# O$ I# g( ?$ |& q1 i4 [
我希望能找到正确答案的任何提示。
, q, y% N. {  r5 X                . j, h* }9 |% L  s
解决方案:) y/ T; V/ }. }
                2 [' q$ ]8 N: Y9 J% h, R  `2 d

% s. ]2 e$ D3 h3 H+ R  Z# U# W' R, J- r1 g& s
                在PostgreSQL 9.0
' b: @" _" A* ?8 W1 C6 n+ m或更高版本中,您可以在聚合函数中对元素进行排序:2 z$ w" @- m# r! w- E6 |
SELECT company_id, array_agg(employee ORDER BY company_id DESC)::text
$ _4 f! f7 k, H8 Y8 Q4 {FROM   tbl
! p/ p& n  K. J( D' zGROUP  BY 1;
5 d5 R" q6 F+ F+ H8 d$ q3 P这不适用于PostgreSQL 8.4
7 \$ i. h8 P& [。您必须预先订购要汇总的值。为此,请使用子选择或CTE(8.4+):
5 g* ~2 a) W% _9 X0 J7 bSELECT company_id, array_agg(employee)::text
2 e, R$ {* Z, g' T' ?FROM  (SELECT * FROM tbl ORDER BY company_id, employee  DESC) x
" ^0 `% T  X. n5 V" V& pGROUP  BY 1;( u' i. Q2 N/ q: s9 O6 y) l2 j
我company_id另外订购,因为这样可以加快聚合速度。
3 L- r0 `; G  _/ s- e我还使用了将数组强制转换为text(array_agg(employee)::text)的“技巧”
! H4 O) Q0 g# f, k( m,它为您提供了一个基本的,用逗号分隔的字符串,而没有额外的空格,这是最快的方法。
* m: X) d2 F3 q8 K4 l5 n对于更复杂的格式设置,请使用array_to_string(array_agg(employee), ', ')与问题相同的格式。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则