这应该可以解决问题:
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;
回报:
ct_total
b
:每人的总数a
。
ct_distinct_b
b
:每个不同的计数a
。
b_arr
b
: 的加频率数组b
,按 的频率排序b
。
b
按per的总数排序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;
可能会更清楚。但它通常较慢。子查询中的行排序适用于像这样的简单查询。更多解释: