Esto debería funcionar:
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;
Devoluciones:
ct_total
:recuento total deb
pora
.ct_distinct_b
:cuenta de distintosb
pora
.b_arr
:matriz deb
más frecuencia deb
, ordenados por frecuencia deb
.
Ordenado por recuento total de b
por a
.
Alternativamente, puede usar un ORDER BY
cláusula dentro de la llamada agregada
en PostgreSQL 9.0 o posterior. Me gusta:
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;
Puede ser más claro. Pero normalmente es más lento. Y ordenar filas en una subconsulta funciona para consultas simples como esta. Más explicación: