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

Редовете, съдържащи груповия максимум на определена колона (как да убия дубликати...)

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

И така, използвайки ROW_NUMBER() за да присвоите на всеки ред нарастващо число, което се нулира на 1 за всяка нова X стойност. За редове с една и съща стойност за X, номерът на реда се присвоява постепенно, подреден по Y НИЗАЙДАЩО и ВЪЗРАЗВАЩО на ID - така че за конкретна стойност на X номер на ред 1 ще бъде присвоен на този с НАЙ-ВИСОКАТА стойност на Y и НАЙ-НИСКАТА стойност на ID. След това добавяме ограничение за връщане само на тези, където RowNo е 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. SQL Server Resumable Index:Добре ли е за вас?

  2. QUALIFY-подобна функция в SQL Server

  3. Изпълнете тригер само когато определени колони се актуализират (SQL сървър)

  4. EntityFramework ConnectionString utf8

  5. Поведение при кръстосано свързване (SQLServer 2008)