To powinno wystarczyć:
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;
Zwroty:
ct_total
:całkowita liczbab
zaa
.ct_distinct_b
:liczba różnychb
zaa
.b_arr
:tablicab
plus częstotliwośćb
, posortowane według częstotliwościb
.
Uporządkowane według całkowitej liczby b
za a
.
Alternatywnie możesz użyć ORDER BY
klauzula w wywołaniu zbiorczym
w PostgreSQL 9.0 lub nowszym. Na przykład:
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;
Może być jaśniejsze. Ale zazwyczaj jest wolniejszy. A sortowanie wierszy w podzapytaniu działa w przypadku prostych zapytań, takich jak to. Więcej wyjaśnień: