这应该就能解决问题了:
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
) t
GROUP BY a
ORDER BY ct_total DESC;
返回:
ct_total
: 每个a
中b
的总数。
ct_distinct_b
: 每个a
中不同b
的数量。
b_arr
: b
的数组加上b
频率,按照b
频率排序。
按每个a
中b
的总数排序。
另外,在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 <b>ORDER BY a, ab_ct DESC, b</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;
可能更清晰,但通常较慢。在子查询中对行进行排序适用于像这样简单的查询。更多解释: