Isso deve fazer o truque:
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;
Devoluções:
ct_total:contagem total debpora.ct_distinct_b:contagem debdistintos pora.b_arr:array debmais frequência deb, classificado por frequência deb.
Ordenado pela contagem total de
b por a . Como alternativa, você pode usar um
ORDER BY cláusula dentro da chamada agregada
no PostgreSQL 9.0 ou posterior. Curti: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; Pode ser mais claro. Mas normalmente é mais lento. E classificar linhas em uma subconsulta funciona para consultas simples como esta. Mais explicação: