TSQL: Partition by in Kombination mit einem DELETE

Nicht ganz so spektakulär, aber vor kurzem hatte ich das Problem, dass ich mit PARTITION BY Datensätze selektieren wollte, die ich danach löschen wollte.Vorab einfach mal, was macht den überhaupt ein PARTITION BY? Eigentlich sehr simpel, ich selektiere Datensätze, versehe diese mit einer Row_Number damit jeder DS eine eindeutige ID erhält und danach Gruppiere ich diese um somit Partitionen von Datensätzen zu bilden.

Beispiel anhand der Northwind Datenbank:

SELECT * FROM (
SELECT CustomerID, PostalCode, City, row_number()
OVER (Partition by PostalCode, City ORDER BY PostalCode, City) As Row
FROM dbo.Customers) t
WHERE t.Row > 1

Ergebnis:

 

 

 

Nun den, so haben wir alle Datensätze wo ich eine doppelte PLZ und einen doppelten Ort habe, in einer Partition. Aber das Partion by ist ja schnell geschrieben, aber die Partition bilde ich ja in der Feldliste des SELECT’s, und nicht in der WHERE Condition. Wie lösche ich nun diese Datensätze?

Ganz einfach … aber vielleicht auch etwas ungewöhlich(?)

DELETE FROM t from  (
SELECT CustomerID, PostalCode, City, row_number()
OVER (Partition by PostalCode, City ORDER BY PostalCode, City) As Row
FROM dbo.Customers2) t
WHERE t.Row > 1

 

Hinterlasse eine Antwort