Kategorien:

Fensterfunktionen (Rangbezogen, Fensterrahmen)

RANK

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

Der Rangwert beginnt bei 1 und steigt fortlaufend an.

Syntax

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

Weitere Informationen zur Syntax von Fensterrahmen finden Sie unter Fensterrahmensyntax und Verwendung.

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

  • Ausdruck1 gibt die Spalte an, anhand der partitioniert werden soll.

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

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

  • Ausdruck2 gibt die Spalte an, anhand der Sie die Rangfolge bestimmen möchten.

    Wenn Sie beispielsweise Landwirte sortieren 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 durch gleiche Werte 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

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

SELECT state, bushels_produced, RANK()
  OVER (ORDER BY bushels_produced DESC)
  FROM corn_production;

+--------+------------------+------+
|  state | bushels_produced | RANK |
+--------+------------------+------+
| Kansas |              130 |     1|
| Kansas |              120 |     2|
| Iowa   |              110 |     3|
| Iowa   |              100 |     4|
+--------+------------------+------+

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

SELECT state, bushels_produced, RANK()
  OVER (PARTITION BY state ORDER BY bushels_produced)
  FROM corn_production;

+--------+------------------+------+
|  state | bushels_produced | RANK |
+--------+------------------+------+
| Iowa   |              110 |     1|
| Iowa   |              100 |     2|
| Kansas |              130 |     1|
| Kansas |              120 |     2|
+--------+------------------+------+

In der folgenden Abfrage und Ausgabe veranschaulichen die Werte für das Bestandssymbol SPY, wie mit gleichen Werten verfahren wird (beachten Sie, dass die Ränge 1, 2, 2, 4 lauten; Rang 3 wird übersprungen, weil es bei Rang 2 zwei gleiche Werte gab):

SELECT
  symbol,
  exchange,
  price,
  RANK() OVER (PARTITION BY symbol ORDER BY price) AS rank
FROM trades;

+------+--------+------+----+
|symbol|exchange|price |RANK|
+------+--------+------+----+
|QQQ   |Q       | 83.99|   1|
|QQQ   |N       | 84.35|   2|
|QQQ   |Q       | 87.49|   3|
|QQQ   |N       | 88.50|   4|
|SPY   |P       |185.27|   1|
|SPY   |N       |186.29|   2|
|SPY   |N       |186.29|   2|
|SPY   |C       |188.47|   4|
|MSFT  |Q       | 38.77|   1|
|MSFT  |Q       | 39.55|   2|
|MSFT  |P       | 39.66|   3|
|MSFT  |P       | 40.00|   4|
|YHOO  |N       | 32.89|   1|
|YHOO  |Q       | 33.49|   2|
|YHOO  |Q       | 34.21|   3|
|YHOO  |P       | 34.48|   4|
|AAPL  |P       |568.33|   1|
|AAPL  |C       |569.42|   2|
|AAPL  |C       |570.37|   3|
|AAPL  |N       |571.94|   4|
+------+--------+------+----+