Điều này sẽ thực hiện thủ thuật:
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;
Lợi nhuận:
-
ct_total
:tổng sốb
pera
. -
ct_distinct_b
:số lượngb
riêng biệt pera
. -
b_arr
:mảngb
cộng với tần suất củab
, được sắp xếp theo tần suấtb
.
Được sắp xếp theo tổng số b
per a
.
Ngoài ra, bạn có thể sử dụng ORDER BY
mệnh đề trong lệnh gọi tổng hợp
trong PostgreSQL 9.0 trở lên. Như:
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;
Có thể rõ ràng hơn. Nhưng nó thường chậm hơn. Và việc sắp xếp các hàng trong một truy vấn con hoạt động đối với các truy vấn đơn giản như thế này. Giải thích thêm: