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

Rzędy utrzymujące maksimum grupowe określonej kolumny (jak zabijać duplikaty...)

DECLARE @Data TABLE (ID INTEGER, X INTEGER, Y INTEGER)
INSERT @Data VALUES (1,1,1),(2,1,2),(3,1,2),(4,1,3),(5,1,3),
    (6,2,4),(7,2,5),(8,2,5),(9,2,5),(10,3,1),(11,3,10),(12,3,10)

;WITH CTE AS
(
SELECT ID, X, Y, 
    ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC, ID ASC) AS RowNo
FROM @Data
)

SELECT ID, X, Y FROM CTE WHERE RowNo = 1

Używając ROW_NUMBER() aby przypisać każdemu wierszowi przyrostową liczbę, która resetuje się do 1 dla każdej nowej wartości X. W przypadku wierszy z tą samą wartością dla X, numer wiersza jest przypisywany przyrostowo według Y malejąco i ID rosnąco - więc dla określonej wartości X, wiersz o numerze 1 zostanie przypisany do tego, który ma NAJWYŻSZĄ wartość Y i NAJNIŻSZY ID. Następnie dodajemy ograniczenie, aby zwracać tylko te, w których RowNo wynosi 1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz znak cyrylicy w SQL

  2. Zaktualizuj, jeśli nazwa istnieje, w przeciwnym razie wstaw - w SQL Server

  3. Warunkowa wydajność agregacji

  4. Import CSV w SQL Server 2008

  5. Wyjątek dotyczący maksymalnych parametrów SqlCommand przy 2099 parametrach