Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Le righe che contengono il massimo in termini di gruppo di una determinata colonna (come eliminare i duplicati...)

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

Quindi, utilizzando ROW_NUMBER() per assegnare a ciascuna riga un numero incrementale che si reimposta a 1 per ogni nuovo valore X. Per le righe con lo stesso valore per X, il numero di riga viene assegnato in modo incrementale per Y DECRESCENTE e ID CRESCENTE - quindi per un particolare valore X, la riga numero 1 sarà assegnata a quella con il valore Y PIÙ ALTO e il valore ID PIÙ BASSO. Aggiungiamo quindi una restrizione per restituire solo quelli in cui RowNo è 1.