Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

MSSQL Изберете Топ 10 печеливши резултати, включително равенства и поне един от всяка категория

Както виждам, трябва да класирате редовете си по по-сложен начин, така че записи, които са най-високите във всяка категория, да бъдат включени независимо от техните стойности, а записи, които не са най-добрите, да бъдат включени според общата им класации.

Това, което ще предложа, може да не е най-ефикасното решение, но би трябвало да работи и, ако нищо друго не може, може да вдъхнови някой друг да измисли нещо по-добро:

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 за игра.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направите колона за изглед NOT NULL

  2. Как да покажа номер на страница в тялото на отчета на SSRS 2008 R2?

  3. Получаване на предупреждение:Нулевата стойност се елиминира чрез агрегат или друга операция SET

  4. Имате проблеми със съхраняването на UTF-8 в NVarChar в SQL Server 2008

  5. Получаване на уникален идентификатор на база данни за SQL Server 2005 и по-нови версии