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
Monday, October 05, 2009 2:06 PM