ご覧のとおり、行をより洗練された方法でランク付けする必要があります。これにより、すべてのカテゴリの上位のエントリが値に関係なく含まれ、上位のエントリ以外のエントリが全体に応じて含まれるようになります。ランキング。
私が提案しようとしていることは、最も効率的な解決策ではないかもしれませんが、それはうまくいくはずであり、他に何もできない場合は、他の誰かにもっと良いものを考え出すように促すかもしれません:
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は、カテゴリごとに行をランク付けすることです。これにより、どのエントリがそれぞれのカテゴリの上位になるかを確認できます。次のステップ(2番目のCTE)は、グローバルランキングを取得することです。今回は、エントリがそのカテゴリのトップであるかどうかを考慮します。カテゴリの上位値はランクが低くなるため、最終結果に確実に含まれます。 (もちろん、カテゴリの数が、出力で受け取りたい個別の値の数を超えないようにする必要があります。)
これが