sql >> Database >  >> RDS >> Sqlserver

De rijen die het groepsgewijze maximum van een bepaalde kolom bevatten (hoe duplicaten te doden...)

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

Dus, met behulp van ROW_NUMBER() om aan elke rij een oplopend nummer toe te wijzen dat voor elke nieuwe X-waarde op 1 wordt teruggezet. Voor rijen met dezelfde waarde voor X, wordt het rijnummer stapsgewijs toegewezen, gerangschikt op Y DESCENDING en ID ASCENDING - dus voor een bepaalde X-waarde wordt rijnummer 1 toegewezen aan degene met de HOOGSTE Y-waarde en de LAAGSTE ID-waarde. We voegen dan een beperking toe om alleen die te retourneren waar RowNo 1 is.



  1. Forceer MySQL om duplicaten van de WHERE IN-clausule te retourneren zonder JOIN/UNION te gebruiken?

  2. Is het mogelijk om een ​​JOINed-tabel te UPDATEN met behulp van Codeigniter's Active Record?

  3. Bereik voor een optionele has_one associatie met zichzelf

  4. SQL Server-tabellen:wat is het verschil tussen @, # en ##?