Както виждам, трябва да класирате редовете си по по-сложен начин, така че записи, които са най-високите във всяка категория, да бъдат включени независимо от техните стойности, а записи, които не са най-добрите, да бъдат включени според общата им класации.
Това, което ще предложа, може да не е най-ефикасното решение, но би трябвало да работи и, ако нищо друго не може, може да вдъхнови някой друг да измисли нещо по-добро:
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
;
Първият CTE класира редове по категории, като по този начин ни позволява да разберем кои записи стават най-добрите в съответните им категории. Следващата стъпка (втора CTE) е за получаване на глобални класации, като този път се взема предвид дали даден запис е най-добрият в своята категория или не. Най-високите стойности на категорията получават по-ниско класиране и по този начин се гарантира, че ще бъдат включени в крайните резултати. (Разбира се, трябва да сте сигурни, че броят на категориите не е по-голям от броя на отделните стойности, които искате да получите в изхода.)
Ето пример на живо в SQL Fiddle за игра.