यह चाल चलनी चाहिए:
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;
स्पष्ट हो सकता है। लेकिन यह आमतौर पर धीमा होता है। और सबक्वायरी में पंक्तियों को सॉर्ट करना इस तरह के सरल प्रश्नों के लिए काम करता है। अधिक स्पष्टीकरण: