Kategorien:

Fensterfunktionen (Rangbezogen, Fensterrahmen)

RANK

Gibt den Rang eines Wertes innerhalb einer sortierten Gruppe von Werten zurück.

Der Rangwert beginnt bei 1 und steigt fortlaufend an.

Wenn zwei Werte gleich sind, haben sie denselben Rang.

Syntax

RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
Copy

Weitere Informationen zur Syntax von window_frame finden Sie unter Syntax und Nutzung von Fensterrahmen.

Argumente

Keine.

Die Funktion selbst nimmt keine Argumente an, da sie den Rang (relative Position) der aktuellen Zeile innerhalb des Fensters zurückgibt, das nach <expr2> geordnet ist. Die Reihenfolge des Fensters bestimmt den Rang, sodass der Funktion RANK kein zusätzlicher Parameter übergeben werden muss.

Nutzungshinweise

  • expr1 gibt die Spalte oder den Ausdruck an, nach der bzw. dem das Fenster partitioniert werden soll.

    Angenommen, Sie möchten eine Rangfolge der Landwirte der einzelnen Bundesstaaten oder Provinzen anhand der von ihnen produzierten Maismenge erstellen. In diesem Fall nehmen Sie eine Partitionierung anhand des Bundesstaats vor.

    Wenn Sie lediglich eine einzige Gruppe benötigen (z. B. Rangordnung aller Landwirte in den USA unabhängig davon, in welchem Bundesstaat sie leben), lassen Sie die PARTITION BY-Klausel weg.

  • expr2 gibt die Spalte oder den Ausdruck an, nach der bzw. dem sortiert (eine Rangfolge erstellt) werden soll.

    Wenn Sie beispielsweise eine Rangfolge der Landwirte erstellen möchten, um zu sehen, wer den meisten Mais produziert hat (im jeweiligen Bundesstaat), verwenden Sie die Spalte bushels_produced. Weitere Details dazu finden Sie unter Beispiele (unter diesem Thema).

  • Gleiche Werte ergeben denselben Rangwert, jedoch ergeben sich bei gleichen Werten Lücken in der Sequenz.

    Wenn beispielsweise drei Zeilen 1 zurückgeben, überspringt RANK die Ränge 2 und 3 und weist 4 der nächsten Zeile in der Gruppe zu.

  • Verwenden Sie stattdessen die Funktion DENSE_RANK, um Lücken zu vermeiden.

Beispiele

Erstellen Sie eine Tabelle und Daten:

-- Create table and load data.
create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels float);
insert into corn_production (farmer_ID, state, bushels) values
    (1, 'Iowa', 100),
    (2, 'Iowa', 110),
    (3, 'Kansas', 120),
    (4, 'Kansas', 130);
Copy

Anzeigen der Maisproduktion von Landwirten in absteigender Reihenfolge zusammen mit dem Ernterang der einzelnen Landwirte (höchster Rang = 1):

SELECT state, bushels,
        RANK() OVER (ORDER BY bushels DESC),
        DENSE_RANK() OVER (ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas |     130 |                                   1 |                                         1 |
| Kansas |     120 |                                   2 |                                         2 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     100 |                                   4 |                                         4 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy

Anzeigen der Maisproduktion von Landwirten im jeweiligen Bundesstaat oder in der jeweiligen Provinz in absteigender Reihenfolge zusammen mit dem Ernterang der einzelnen Landwirte (höchster Rang = 1):

SELECT state, bushels,
        RANK() OVER (PARTITION BY state ORDER BY bushels DESC),
        DENSE_RANK() OVER (PARTITION BY state ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) |
|--------+---------+--------------------------------------------------------+--------------------------------------------------------------|
| Iowa   |     110 |                                                      1 |                                                            1 |
| Iowa   |     100 |                                                      2 |                                                            2 |
| Kansas |     130 |                                                      1 |                                                            1 |
| Kansas |     120 |                                                      2 |                                                            2 |
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
Copy

Abfrage und Ausgabe unten zeigen, wie die Funktionen RANK() und DENSE_RANK() mit gleichen Werten verfahren. Beachten Sie, dass für DENSE_RANK die Ränge 1, 2, 3, 3, 4 sind. Im Gegensatz zur Ausgabe der Funktion RANK() wird Rang 4 nicht übersprungen, auch wenn es bei Rang 3 zwei gleiche Werte gab:

SELECT state, bushels,
        RANK() OVER (ORDER BY bushels DESC),
        DENSE_RANK() OVER (ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas |     130 |                                   1 |                                         1 |
| Kansas |     120 |                                   2 |                                         2 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     100 |                                   5 |                                         4 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy