जैसा कि मैं इसे देख सकता हूं, आपको अपनी पंक्तियों को अधिक परिष्कृत तरीके से रैंक करने की आवश्यकता है, ताकि प्रत्येक श्रेणी में शीर्ष प्रविष्टियां उनके मूल्यों की परवाह किए बिना शामिल की जा सकें, और जो प्रविष्टियां शीर्ष पर नहीं हैं उन्हें उनके समग्र के अनुसार शामिल किया गया है। रैंकिंग।
मैं जो सुझाव देने जा रहा हूं वह सबसे कुशल समाधान नहीं हो सकता है, लेकिन यह काम करना चाहिए और अगर कुछ और नहीं कर सकता है, तो किसी और को कुछ बेहतर करने के लिए प्रेरित कर सकता है:
WITH ranked1 AS (
SELECT
*,
RankByCategory = DENSE_RANK() OVER (
PARTITION BY CategoryID
ORDER BY Score DESC
)
FROM YourTable
),
ranked2 AS (
SELECT
*,
FinalRank = DENSE_RANK() OVER (
ORDER BY
CASE RankByCategory WHEN 1 THEN 1 ELSE 2 END,
Score DESC
)
FROM ranked1
)
SELECT
EntryID,
CategoryID,
Score
FROM ranked2
WHERE FinalRank <= @top_n
;
पहला सीटीई श्रेणियों के आधार पर पंक्तियों की रैंकिंग कर रहा है, इस प्रकार हमें यह पता लगाने देता है कि कौन सी प्रविष्टियाँ अपनी-अपनी श्रेणियों में शीर्ष पर हैं। अगला चरण (दूसरा सीटीई) वैश्विक रैंकिंग प्राप्त करने के बारे में है, इस बार यह ध्यान में रखते हुए कि कोई प्रविष्टि अपनी श्रेणी में शीर्ष पर है या नहीं। श्रेणी के शीर्ष मान निम्न रैंकिंग प्राप्त करते हैं और इस प्रकार अंतिम परिणामों में शामिल होना सुनिश्चित किया जाता है। (बेशक, आपको यह सुनिश्चित करने की आवश्यकता है कि श्रेणियों की संख्या उन विशिष्ट मानों की संख्या से अधिक नहीं है जिन्हें आप आउटपुट में प्राप्त करना चाहते हैं।)
यह रहा एसक्यूएल फिडल पर लाइव उदाहरण साथ खेलने के लिए।