Das sollte funktionieren:
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;
Rückgabe:
ct_total
:Gesamtanzahl vonb
proa
.ct_distinct_b
:Anzahl unterschiedlicherb
proa
.b_arr
:Array vonb
plus Häufigkeit vonb
, sortiert nach Häufigkeit vonb
.
Geordnet nach der Gesamtzahl von b
pro a
.
Alternativ können Sie einen ORDER BY
verwenden -Klausel innerhalb des Aggregataufrufs
in PostgreSQL 9.0 oder höher. Wie:
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;
Kann klarer sein. Aber es ist normalerweise langsamer. Und das Sortieren von Zeilen in einer Unterabfrage funktioniert für einfache Abfragen wie diese. Weitere Erklärung: