प्रश्न को ध्यान से पढ़ें
और:
प्रदर्शन के लिए महत्वपूर्ण बिंदु अप्रासंगिक पंक्तियों को जल्दी बाहर करना है और दिए गए उपसमूह के लिए केवल समुच्चय की गणना करें . फिर (कुछ विशिष्ट उपसमूहों से अधिक मानते हुए), (subgroup)
. पर एक अनुक्रमणिका मदद कर सकता है:
CREATE INDEX ON foo (subgroup);
निम्न में से प्रत्येक क्वेरी FALSE
लौटाती है यदि दिए गए उपसमूह के लिए कम से कम दो समूहों के पास अलग-अलग कुल योग हैं, और TRUE
सभी . में अन्य मामले (क्वेरी 5 के लिए एक मामूली अपवाद के साथ, नीचे देखें)।
क्वेरी 1
SELECT count(DISTINCT total_power) = 1
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_B' -- exclude irrelevant rows early!
GROUP BY grp
) sub;
क्वेरी 2
SELECT count(*) = 1
FROM (
SELECT true
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_C'
GROUP BY grp
) sub2
GROUP BY total_power
) sub2;
क्वेरी 3
SELECT count(*) OVER () = 1
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub
GROUP BY total_power
LIMIT 1;
क्वेरी 4
(
SELECT FALSE
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub
GROUP BY total_power
OFFSET 1
LIMIT 1
)
UNION ALL
SELECT TRUE
LIMIT 1;
यह खास है। स्पष्टीकरण के साथ संबंधित उत्तर:
क्वेरी 5
SELECT min(total_power) = max(total_power) -- can fail for NULL values
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub;
अंतिम विफल हो सकता है यदि NULL
सत्ता में मूल्यों की अनुमति है। (लेकिन आपको इस मामले में वैसे भी अपेक्षित परिणामों को परिभाषित करना होगा।)
मैंने एक व्यापक परीक्षण चलाया और आदर्श परिस्थितियों में समान प्रदर्शन करने के लिए सभी प्रश्नों को पाया:
db<>fiddle यहां
प्रश्न 5 बाकी की तुलना में थोड़ा तेज था।