এটি একরকমভাবে লেনার্টের সমাধানের জন্য একটি এক্সটেনশন , তবে এটি এতই কুৎসিত যে আমি এটিকে সম্পাদনা হিসাবে প্রস্তাব করার সাহস পাই না। এখানে লক্ষ্যটি কোনও উত্পন্ন টেবিল ছাড়াই ফলাফল পাওয়া the এটির প্রয়োজন নেই এবং কোয়েরির কদর্যতার সাথে একত্রে পুরো প্রচেষ্টাটি একটি ব্যর্থ প্রচেষ্টা বলে মনে হতে পারে। আমি এখনও এটি অনুশীলন হিসাবে করতে চেয়েছিলাম, এবং এখন আমার ফলাফলটি ভাগ করে নিতে চাই:
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
;
ডিবি <> fiddle.uk এ এই লাইভ ডেমোটি সমাধানের উভয় প্রকারের পরীক্ষা করতে ব্যবহার করা যেতে পারে।