Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

As linhas que mantêm o máximo de grupo de uma determinada coluna (como matar duplicatas ...)

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

Portanto, usando ROW_NUMBER() para atribuir a cada linha um número incremental que redefine para 1 para cada novo valor X. Para linhas com o mesmo valor para X, o número da linha é atribuído de forma incremental ordenada por Y DESCENDENTE e ID ASCENDENTE - portanto, para um valor X específico, o número da linha 1 será atribuído àquela com o valor de Y MAIS ALTO e o valor de ID MAIS BAIXO. Em seguida, adicionamos uma restrição para retornar apenas aqueles em que RowNo é 1.