यह, एक तरह से, लेनार्ट के समाधान का एक विस्तार है , लेकिन यह इतना बदसूरत है कि मैं इसे एक संपादन के रूप में सुझाव देने की हिम्मत नहीं करता। यहां लक्ष्य एक व्युत्पन्न तालिका के बिना परिणाम प्राप्त करना है। उस की आवश्यकता कभी नहीं हो सकती है, और क्वेरी की कुरूपता के साथ संयुक्त पूरे प्रयास को एक व्यर्थ प्रयास की तरह लग सकता है। मैं अभी भी इसे एक अभ्यास के रूप में करना चाहता था, हालांकि, और अब मैं अपना परिणाम साझा करना चाहूंगा:
SELECT
Col_A,
Col_B,
DistinctCount = DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B ASC )
+ DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B DESC)
- 1
- CASE COUNT(Col_B) OVER (PARTITION BY Col_A)
WHEN COUNT( * ) OVER (PARTITION BY Col_A)
THEN 0
ELSE 1
END
FROM
dbo.MyTable
;
गणना का मुख्य हिस्सा यह है (और मैं सबसे पहले यह नोट करना चाहूंगा कि विचार मेरा नहीं है, मैंने इस चाल के बारे में कहीं और सीखा है):
DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B ASC )
+ DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B DESC)
- 1
इस अभिव्यक्ति का उपयोग बिना किसी परिवर्तन के किया जा सकता है यदि मूल्यों की Col_B
गारंटी है कि कभी भी अशक्त नहीं है। यदि स्तंभ में नल हो सकते हैं, हालांकि, आपको इसके लिए खाते की आवश्यकता है, और यह वही है जो CASE
अभिव्यक्ति के लिए है। यह प्रति विभाजन Col_B
मानों की संख्या के साथ विभाजन की पंक्तियों की संख्या की तुलना करता है । यदि संख्या भिन्न होती है, तो इसका मतलब है कि कुछ पंक्तियों में एक अशक्त है Col_B
, इसलिए, प्रारंभिक गणना ( DENSE_RANK() ... + DENSE_RANK() - 1
) को 1 से कम करने की आवश्यकता है।
ध्यान दें कि क्योंकि - 1
मूल सूत्र का हिस्सा है, मैंने इसे उसी तरह छोड़ने का विकल्प चुना। हालांकि, इसे वास्तव में CASE
अभिव्यक्ति में शामिल किया जा सकता है , संपूर्ण समाधान को कम बदसूरत बनाने के निरर्थक प्रयास में:
SELECT
Col_A,
Col_B,
DistinctCount = DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B ASC )
+ DENSE_RANK() OVER (PARTITION BY Col_A ORDER BY Col_B DESC)
- CASE COUNT(Col_B) OVER (PARTITION BY Col_A)
WHEN COUNT( * ) OVER (PARTITION BY Col_A)
THEN 1
ELSE 2
END
FROM
dbo.MyTable
;
Db <> fiddle.uk पर इस लाइव डेमो का उपयोग समाधान के दोनों रूपों का परीक्षण करने के लिए किया जा सकता है।