在SELECT中创建srray

Dev*_*ter 6 sql postgresql aggregate aggregate-functions postgresql-9.1

我正在使用PostgreSQL 9.1,我有这样的数据结构:

A     B
-------
1     a
1     a
1     b
1     c
1     c
1     c
1     d
2     e
2     e
Run Code Online (Sandbox Code Playgroud)

我需要一个产生这个结果的查询:

1    4     {{c,3},{a,2},{b,1},{d,1}}
2    1     {{e,2}}
Run Code Online (Sandbox Code Playgroud)

A = 1,4行总共A = 1,部分计数(3行带c值,2行带值,.....)

  • 列"A"的不同值
  • 与"A"值相关的所有行的计数
  • 数组包含与"A"值相关的所有元素及其自身的相对计数

数组所需的排序基于每个组的计数(如示例3,2,1,1).

Erw*_*ter 10

这应该做的伎俩:

SELECT a
     , sum(ab_ct)::int AS ct_total
     , count(*)::int   AS ct_distinct_b
     , array_agg(b || ', ' || ab_ct::text) AS b_arr
FROM  (
    SELECT a, b, count(*) AS ab_ct
    FROM   tbl
    GROUP  BY a, b
    ORDER  BY a, ab_ct DESC, b  -- append "b" to break ties in the count
    ) t
GROUP  BY a
ORDER  BY ct_total DESC;
Run Code Online (Sandbox Code Playgroud)

返回:

  • ct_total:总计数b每a.
  • ct_distinct_b:b每个人的数量a.
  • b_arr:b加频率数组b,按频率排序b.

由总数有序b每a.

或者,您可以在PostgreSQL 9.0或更高版本ORDER BY的聚合调用中使用子句.喜欢:

SELECT a
     , sum(ab_ct)::int AS ct_total
     , count(*)::int   AS ct_distinct_b
     , array_agg(b || ', ' || ab_ct::text ORDER BY a, ab_ct DESC, b) AS b_arr
FROM  (
    SELECT a, b, count(*) AS ab_ct
    FROM   tbl
    GROUP  BY a, b
    ) t
GROUP  BY a
ORDER  BY ct_total DESC;
Run Code Online (Sandbox Code Playgroud)

可能会更清楚.但它通常较慢.对子查询中的行进行排序适用于像这样的简单查询.更多解释:


小智 6

也许我错过了一些东西,但这应该可以做到:

SELECT a, 
       count(*) as cnt,
       array_agg(b) as all_values
FROM your_table
GROUP BY a
Run Code Online (Sandbox Code Playgroud)