sql >> Databáze >  >> RDS >> Sqlserver

MSSQL Select Top 10 vítězných skóre, včetně remíz a alespoň jednoho z každé kategorie

Jak vidím, musíte své řádky seřadit sofistikovanějším způsobem, aby položky, které jsou v každé kategorii nejlepší, byly zahrnuty bez ohledu na jejich hodnoty, a položky, které nejsou nejlepší, byly zahrnuty podle jejich celkového žebříčku.

To, co se chystám navrhnout, nemusí být nejúčinnější řešení, ale mělo by fungovat, a pokud nic jiného nemůže, mohlo by inspirovat někoho dalšího, aby přišel s něčím lepším:

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
;

První CTE seřadí řádky podle kategorií, což nám umožňuje zjistit, které položky se staly nejlepšími ve svých příslušných kategoriích. Další krok (druhý CTE) je o získání globálního žebříčku, tentokrát s přihlédnutím k tomu, zda je položka top ve své kategorii či nikoli. Nejlepší hodnoty v kategorii dostávají nižší hodnocení a mají tak zajištěno, že budou zahrnuty do konečných výsledků. (Samozřejmě se musíte ujistit, že počet kategorií není větší než počet různých hodnot, které chcete získat ve výstupu.)

Zde je živý příklad na SQL Fiddle hrát.




  1. PHP/MySQL:Ukládání a načítání UUIDS

  2. Zrychlit plpgsql, který počítá typy dokumentů ve smyčce?

  3. Formátování výstupu powershell SQL Server do sloupců a řádků

  4. Jak nahradit primární klíč Django jiným celým číslem, které je pro danou tabulku jedinečné