Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Zeilen, die das gruppenweise Maximum einer bestimmten Spalte enthalten (wie man Duplikate tötet ...)

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

Verwenden Sie also ROW_NUMBER() um jeder Zeile eine inkrementelle Nummer zuzuweisen, die für jeden neuen X-Wert auf 1 zurückgesetzt wird. Für Zeilen mit demselben Wert für X wird die Zeilennummer inkrementell nach Y DESCENDING und ID ASCENDING geordnet zugewiesen. Für einen bestimmten X-Wert wird also Zeilennummer 1 der Zeile mit dem HÖCHSTEN Y-Wert und dem NIEDRIGSTEN ID-Wert zugewiesen. Wir fügen dann eine Einschränkung hinzu, um nur diejenigen zurückzugeben, bei denen RowNo 1 ist.