| T-SQL Ranking Funktionen unter SQL Server 2005 und 2008 |
|
|
|
| SQL Server - SQL 2005 Administration | ||||||
| Geschrieben von: Fumus | ||||||
| Sonntag, 08. Februar 2009 um 14:42 | ||||||
Seite 1 von 2 Seite 1 von 2
Zu den T-SQL Erweiterungen des SQL Server 2005 gehören unter anderen die sogenannten Rangfolgefunktionen. Darunter befinden sich Rank(), Row_number(), Ntile() und Dense_Rank(). Was diese Funktionen leisten können Sie im folgenden Artikel nachlesen.
Zu den T-SQL Erweiterungen des SQL Server 2005 gehören unter anderen die sogenannten Rangfolgefunktionen. Darunter befinden sich Rank(), Row_number(), Ntile() und Dense_Rank(). Was diese Funktionen leisten können Sie im folgenden Artikel nachlesen.
Die sogenannten Rangfolgefunktionen erlauben es innerhalb der auszugebenden Daten Rangfolgenummern auszugeben. Zu diesen - eigtl OLAP Erweiterungen - Funktionen gehören:
Anhand eines kleinen überschaubaren Beispiels, möchte ich den den Einsatz der Funktionen näher zu bringen. Folgenden Tabelle soll als Ausgangspunkt für unsere Beispiele dienen.
/*------------------------
select * from Kunden ------------------------*/ KDID Firma Umsatz Ort ----------- ------------------------ --------------------- ----------- 1 Micodat 12000,00 84489 2 Orical 132222,00 76632 3 Logitak 3222,00 23444 4 ucdesign 12342,00 84489 5 ppedv 23456,00 84489 6 edv consulting 234543,00 76632 7 Traulsen Gmbh 33221,00 65542 8 Müller Brezn AG 12,00 54542 9 Wappis BHs 88765,00 50200 10 Preiselbär AG 12,00 54542 Die Reihenfolgenfunktionen haben im Prinzip immer den gleichen Aufbau.
Zuerst wird die Reihenfolgefunktion augerufen. Anschliessen muß per OVER (order by ...) die Spalte gewählt werden, über welche die Reihenfolgefunktion angewendet werden soll. Die partition by ... kann innerhalb der Sortierungsangabe eine Unterteilung vornehmen. Näheres dazu sehen wir in den folgenden Beispielen. ROW_NUMBER()Nehmen wir uns mal zunächst die Row_number() Funktion vor. Wir haben zwar in unserer Tabelle bereits eine fortlaufende ID (KD identity). Allerdings möchten wir unter Umständen die Zeilennummer auch mal anderweitig - bsp. Umsatz- vergeben. /*------------------------ select firma,ort, umsatz, row_number() over (order by Umsatz desc ) as ZNr from kunden ------------------------*/ firma ort umsatz ZNr -------------------------------------------------- ----------- --------------------- --- edv consulting 76632 234543,00 1 Orical 76632 132222,00 2 Wappis BHs 50200 88765,00 3 Traulsen Gmbh 65542 33221,00 4 ppedv 84489 23456,00 5 ucdesign 84489 12342,00 6 Micodat 84489 12000,00 7 Logitak 23444 3222,00 8 Müller Brezn AG 54542 12,00 9 Preiselbär AG 54542 12,00 10 Wir sehen, dass nun die Daten nach Umsatz sortiert wurden (..(order by Umsatz)..) und die Zeilennummer in dieser Reihenfolge vergeben worden sind. Natürlich können wir die Sortierung aufsteigen oder absteigend per desc bestimmen. Nun haben wir aber im Beispiel mehere Firmen die den gleichen Umsatz aufweisen. daher ist also sportlichen Denken angesagt. Gleicher Rang für gleiche Werte. RANK()Die Rank() Funktion verteilt, wie bei Sportereignissen den gleichen Rang für gleiche Ergebnisse. In unserem Fall durch das order by bestimmt. Wie erwartet sind die Umsätze mit 12,00 beide auf Rang 9 gelandet.
firma ort umsatz ZNr Rang -------------------------------------------------- ----------- --------------------- ----- ----- edv consulting 76632 234543,00 1 1 Orical 76632 132222,00 2 2 Wappis BHs 50200 88765,00 3 3 Traulsen Gmbh 65542 33221,00 4 4 ppedv 84489 23456,00 5 5 ucdesign 84489 12342,00 6 6 Micodat 84489 12000,00 7 7 Logitak 23444 3222,00 8 8 Müller Brezn AG 54542 12,00 9 9 Preiselbär AG 54542 12,00 10 9
|




