Kategorien:

Fensterfunktionen (Rangbezogen, Fensterrahmen)

DENSE_RANK

Gibt den Rang eines Wertes innerhalb einer Gruppe von Werten zurück (ohne Lücken in den Rängen).

Der Rangwert beginnt bei 1 und steigt fortlaufend an.

Wenn zwei Werte gleich sind, haben sie denselben Rang.

Syntax

DENSE_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

Ausdruck1:

Die Spalte oder der Ausdruck, nach der bzw. dem das Fenster 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. Ordnen aller Landwirte unabhängig vom Bundesstaat, in dem sie leben), lassen Sie die PARTITION BY-Klausel weg.

Ausdruck2:

Die Spalte oder der Ausdruck, nach der/dem sortiert werden soll (Rang).

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).

Nutzungshinweise

  • Gleiche Werte ergeben denselben Rangwert, anders als bei RANK führen sie jedoch nicht zu Lücken in der Sequenz.

Beispiele

Erstellen Sie eine Tabelle und Daten:

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

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

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

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_produced, DENSE_RANK()
      OVER (PARTITION BY state ORDER BY bushels_produced DESC)
      FROM corn_production;
+--------+------------------+----------------------------------------------------------------+
| STATE  | BUSHELS_PRODUCED |                                                   DENSE_RANK() |
|        |                  |       OVER (PARTITION BY STATE ORDER BY BUSHELS_PRODUCED DESC) |
|--------+------------------+----------------------------------------------------------------|
| Iowa   |              110 |                                                              1 |
| Iowa   |              100 |                                                              2 |
| Kansas |              130 |                                                              1 |
| Kansas |              120 |                                                              2 |
+--------+------------------+----------------------------------------------------------------+

Die folgende Abfrage und Ausgabe zeigen, wie mit gleichen Werten verfahren wird. Beachten Sie, dass die Ränge 1, 2, 3, 3, 4 lauten. 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_produced, DENSE_RANK()
      OVER (ORDER BY bushels_produced DESC)
      FROM corn_production;
+--------+------------------+---------------------------------------------+
| STATE  | BUSHELS_PRODUCED |                                DENSE_RANK() |
|        |                  |       OVER (ORDER BY BUSHELS_PRODUCED DESC) |
|--------+------------------+---------------------------------------------|
| Kansas |              130 |                                           1 |
| Kansas |              120 |                                           2 |
| Iowa   |              110 |                                           3 |
| Iowa   |              110 |                                           3 |
| Iowa   |              100 |                                           4 |
+--------+------------------+---------------------------------------------+