Това трябва да свърши работа:
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;
Връща:
ct_total
:общ брой наb
заa
.ct_distinct_b
:брой отделниb
заa
.b_arr
:масив отb
плюс честотата наb
, сортирани по честота наb
.
Подредени по общ брой на b
за a
.
Като алтернатива можете да използвате ORDER BY
клауза в рамките на сборното извикване
в PostgreSQL 9.0 или по-нова версия. Като:
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;
Може и по-ясно. Но обикновено е по-бавно. И сортирането на редове в подзаявка работи за прости заявки като тази. Повече обяснение: