Mit Hilfe von ROW_NUMBER() lassen sich tolle Sachen machen. Die einfachste Anwendung ist die Nummerierung von Datensätzen nach einer festgelegten Sortierreihenfolge.
Ein kleines Beispiel:
Wir haben die Tabelle tBirthdates mit den Geburtsdaten einiger Leute.
CREATE TABLE tBirthdates
(
Name VARCHAR(50),
Gender bit, -- 0 = male, 1 = female
Birthdate DATETIME
)
GO
INSERT INTO tBirthdates VALUES ('Peter', 0, '19800502')
INSERT INTO tBirthdates VALUES ('Mary', 1, '19810603')
INSERT INTO tBirthdates VALUES ('Hans', 0, '19840830')
INSERT INTO tBirthdates VALUES ('Pedro', 0, '19720502')
INSERT INTO tBirthdates VALUES ('Mario', 0, '19651002')
INSERT INTO tBirthdates VALUES ('Maria', 1, '19850221')
INSERT INTO tBirthdates VALUES ('Lena', 1, '19601231')
GO
Um nun die Geburtstage aller sortiert nach dem Datum zu nummerieren folgendes SQL-Statement:
SELECT Reihenfolge = ROW_NUMBER() OVER (ORDER BY Birthdate)
,*
FROM tBirthdates
Gibt als Ergebnis die durchnummerierte Reihenfolge des Geburtsdatums.
Zur Erläuterung: ROW_NUMBER() benötigt immer eine Sortierreihenfolge in der OVER Klausel um entscheiden zu können, wo die Zählung anfängt und wo sie aufhört. Doch ROW_NUMBER() kann noch mehr. Möchte man die Geburtsdaten durchnummeriert nach Geschlecht hilft folgendes SQL-Statement:
SELECT Reihenfolge = ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY Birthdate)
,*
FROM tBirthdates
Hier wird in der OVER Klausel nach Gender, also dem Geschlecht partitioniert. Das kann man sich vorstellen wie eine Gruppierung. ROW_NUMBER() zählt die Einträge pro Gruppe durch (wieder sortiert nach dem Geburtsdatum). Ergebnis siehe Screenshot.
Das ist es im Grunde auch schon. Mehr Informationen gibt es u.a. hier: http://msdn.microsoft.com/de-de/library/ms186734.aspx