Dit zou het moeten doen:
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;
Retourneren:
ct_total:totaal aantalbpera.ct_distinct_b:aantal verschillendebpera.b_arr:array vanbplus frequentie vanb, gesorteerd op frequentie vanb.
Geordend op totaal aantal b per a .
Als alternatief kunt u een ORDER BY gebruiken clausule binnen de geaggregeerde aanroep
in PostgreSQL 9.0 of hoger. Vind ik leuk:
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; Mag duidelijker zijn. Maar het is meestal langzamer. En het sorteren van rijen in een subquery werkt voor eenvoudige query's zoals deze. Meer uitleg: