Mit CTE und RANK kann man ab SQL Server 2005 eine Liste von Daten ausgeben lassen, welche je Gruppe z.B. den höchsten Wert ausgibt.

In diesem Beispiel habe ich den Postleitzahlenstamm der Schweiz. Hier gibt es mit der gleichen PLZ x Bezeichungen welche mit einer Priorität versehen sind. Ein Beispiel:

1000    Lausanne     00
1000    Lausanne 1   01
1000    Lausanne 2   02
1000    Lausanne 3   03

Ich möchte jetzt eine Liste von PLZ sehen, worin aber jede PLZ nur einmal vor kommt und zwar jene mit der tiefsten Prio.
Das geht wie folgt:


WITH PostCodes AS
(
SELECT PostCode,city,
RANK() OVER( PARTITION BY PostCode ORDER BY Priority) AS rn
FROM PostCodeDirectory )
SELECT *
FROM PostCodes
WHERE rn=1

Mit PARTITION BY  gebe ich an, nach was "gruppiert" werden soll und dahinter die Reihenfolge(könnte z.B. auch der Umsatz, letzter Verkauf,...) sein.
Mit dem Filterauf rn=1 bekomme ich dann pro Gruppe nur einen Datensatz.

1000    Lausanne
1001    Lausanne
1002    Lausanne
1003    Lausanne
1004    Lausanne