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行带值,.....)
数组所需的排序基于每个组的计数(如示例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)
| 归档时间: |
|
| 查看次数: |
13496 次 |
| 最近记录: |