Home SQL Server SQL 2005 Administration T-SQL Ranking Funktionen unter SQL Server 2005 und 2008
T-SQL Ranking Funktionen unter SQL Server 2005 und 2008 PDF Drucken E-Mail
Benutzerbewertung: / 1
SchwachPerfekt 
SQL Server - SQL 2005 Administration
Geschrieben von: Fumus   
Sonntag, 08. Februar 2009 um 14:42
Beitragsseiten
T-SQL Ranking Funktionen unter SQL Server 2005 und 2008
Rankingfunktionen für SQL Server
Alle Seiten

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:
 
  •      RANK(),
  •      DENSE_RANK(),
  •      NTILE() und
  •      ROW_NUMBER().
 
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.
 
Funktion ( )     OVER ( [ ] partition_by_clause>)


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.

/*------------------------
select firma,ort, umsatz,
row_number() over (order by Umsatz desc ) as ZNr,
rank() over (order by Umsatz desc ) as Rang
from kunden
------------------------*/


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



 
SEO by Artio