मुझे लगता है कि जिस कारण से आप सबक्वायरी को खत्म करना चाहते हैं वह उपयोगकर्ता तालिका को दो बार स्कैन करने से बचना है। याद रखें कि कुल प्रत्येक देश की गणनाओं का योग है।
WITH c AS (
SELECT
country_id,
count(*) AS cnt
FROM users
WHERE cond1=...
GROUP BY country_id
)
SELECT
*,
100.0 * cnt / (SELECT sum(cnt) FROM c) AS percent
FROM c;
यह क्वेरी प्रति-देश आँकड़ों के साथ एक छोटा CTE बनाती है। यह केवल एक बार उपयोगकर्ता तालिका को स्कैन करेगा, और एक छोटा परिणाम सेट (प्रति देश केवल एक पंक्ति) उत्पन्न करेगा।
इस छोटे से परिणाम सेट पर कुल (चुनें योग(cnt) से c) की गणना केवल एक बार की जाती है, इसलिए यह नगण्य समय का उपयोग करता है।
आप विंडो फ़ंक्शन का भी उपयोग कर सकते हैं:
SELECT
country_id,
cnt,
100.0 * cnt / (sum(cnt) OVER ()) AS percent
FROM (
SELECT country_id, count(*) as cnt from users group by country_id
) foo;
(जो कि नाइटवॉल्फ की क्वेरी के समान है जिसमें त्रुटियों को हटा दिया गया है)
दोनों प्रश्नों में लगभग एक ही समय लगता है।