Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Les lignes contenant le maximum par groupe d'une certaine colonne (comment supprimer les doublons ...)

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

Donc, en utilisant ROW_NUMBER() pour attribuer à chaque ligne un numéro incrémental qui se réinitialise à 1 pour chaque nouvelle valeur X. Pour les lignes avec la même valeur pour X, le numéro de ligne est attribué par ordre incrémentiel par Y DESCENDING et ID ASCENDING - donc pour une valeur X particulière, le numéro de ligne 1 sera attribué à celui avec la valeur Y LA PLUS ÉLEVÉE et la valeur ID LA PLUS BASSE. Nous ajoutons ensuite une restriction pour ne renvoyer que ceux où RowNo vaut 1.