Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

MSSQL Select Top 10 zwycięskich wyników, w tym remisy i co najmniej jeden z każdej kategorii

Jak widzę, musisz uszeregować swoje wiersze w bardziej wyrafinowany sposób, aby wpisy, które znajdują się na szczycie w każdej kategorii, były uwzględniane niezależnie od ich wartości, a wpisy, które nie są najwyższymi, były uwzględniane według ich ogólnej rankingi.

To, co zamierzam zasugerować, może nie jest najskuteczniejszym rozwiązaniem, ale powinno działać, a jeśli nic innego nie może, może zainspirować kogoś innego do wymyślenia czegoś lepszego:

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
;

Pierwsze CTE to ranking wierszy według kategorii, dzięki czemu możemy dowiedzieć się, które wpisy stają się najlepszymi w swoich kategoriach. Kolejny krok (drugi CTE) to uzyskanie globalnych rankingów, tym razem z uwzględnieniem tego, czy wpis jest najlepszy w swojej kategorii, czy nie. Najwyższe wartości kategorii otrzymują niższe rankingi, dzięki czemu mają pewność, że zostaną uwzględnione w ostatecznych wynikach. (Oczywiście musisz upewnić się, że liczba kategorii nie jest większa niż liczba odrębnych wartości, które chcesz otrzymać w wyniku).

Oto przykład na żywo w SQL Fiddle do zabawy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd krytyczny:wywołanie niezdefiniowanej funkcji sqlsrv_connect()

  2. OrderBy w SQL Server, aby umieścić wartości dodatnie przed wartościami ujemnymi

  3. Czy T-SQL ma funkcję agregującą do łączenia ciągów?

  4. Jak zamienić pierwszy i ostatni znak kolumny w serwerze sql?

  5. Spróbuj Catch Nie mogę obsłużyć tabeli zmiany