इस प्रश्न में जितना प्रतीत हो सकता है, उससे कहीं अधिक है।
साधारण संस्करण
यह काफी है तेज़ और आसान:
SELECT property_name
,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
FROM my_obj
GROUP BY 1;
परिणाम:
property_name | pct
--------------+----
prop_1 | 17
prop_2 | 43
कैसे?
-
इसके लिए आपको किसी फंक्शन की बिल्कुल भी जरूरत नहीं है।
-
value_b
counting की गणना करने के बजाय (जिसे आपको शुरू करने की आवश्यकता नहीं है) और कुल की गणना करते हुए,count(*)
. का उपयोग करें कुल के लिए। तेज़, आसान। -
यह मानता है कि आपके पास
NULL
नहीं है मूल्य। अर्थात। दोनों कॉलम परिभाषित हैंNOT NULL
. आपके प्रश्न में जानकारी गायब है।
यदि नहीं, तो आपकी मूल क्वेरी शायद वह नहीं कर रही है जो आपको लगता है कि यह करता है . यदि कोई मान NULL है, तो आपका संस्करण उस पंक्ति की बिल्कुल भी गणना नहीं करता है। आप विभाजन-दर-शून्य . को भी भड़का सकते हैं इस तरह से अपवाद।
यह संस्करण NULL के साथ भी काम करता है।count(*)
मानों की परवाह किए बिना सभी पंक्तियों की गिनती उत्पन्न करता है। -
यहां बताया गया है कि गिनती कैसे काम करती है:
TRUE OR NULL = TRUE FALSE OR NULL = NULL
count()
NULL मानों को अनदेखा करता है। वोइला। -
संचालिका वरीयता यह नियंत्रित करती है कि
=
OR
. से पहले बाइंड करता है . आप इसे स्पष्ट करने के लिए कोष्ठक जोड़ सकते हैं:count ((value_a = value_b) OR FALSE)
-
आप
. के साथ भी ऐसा ही कर सकते हैंcount NULLIF(<expression>, FALSE)
-
परिणाम का प्रकार
count()
bigint
है डिफ़ॉल्ट रूप से।
एक डिवीजनbigint / bigint
, आंशिक अंकों को छोटा करता है ।
आंशिक अंक शामिल करें
100.0
का प्रयोग करें (आंशिक अंकों के साथ) गणना को numeric
होने के लिए बाध्य करने के लिए और इस प्रकार भिन्नात्मक अंकों को संरक्षित करते हैं।
आप round()
. का उपयोग करना चाह सकते हैं इसके साथ:
SELECT property_name
,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
FROM my_obj
GROUP BY 1;
परिणाम:
property_name | pct
--------------+-------
prop_1 | 17.23
prop_2 | 43.09
एक तरफ के रूप में:
मैं value_a
का उपयोग करता हूं valueA
. के बजाय . PostgreSQL में गैर-उद्धृत मिश्रित-केस आइडेंटिफ़ायर का उपयोग न करें। मैंने इस मूर्खता से बहुत अधिक हताश करने वाले प्रश्न आते हुए देखे हैं। यदि आप सोच रहे हैं कि मैं किस बारे में बात कर रहा हूं, तो मैनुअल में अध्याय पहचानकर्ता और कीवर्ड पढ़ें।