Kategorien:

Fensterfunktionen (Rangbezogen, Fensterrahmen)

FIRST_VALUE

Gibt den ersten Wert innerhalb einer geordneten Gruppe von Werten zurück.

Siehe auch:

LAST_VALUE, NTH_VALUE

Syntax

FIRST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
                      OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2>  [ { ASC | DESC } ] [ <window_frame> ] )

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

Argumente

expr

Ausdruck, der den Rückgabewert bestimmt.

expr1

Ausdruck, nach dem die Zeilen partitioniert werden sollen. Es kann ein einzelner Ausdruck oder eine durch Komma getrennte Liste von Ausdrücken angegeben werden. Beispiel:

PARTITION BY column_1, column_2
expr2

Ausdruck, nach dem die Zeilen sortiert werden sollen. Es kann ein einzelner Ausdruck oder eine durch Komma getrennte Liste von Ausdrücken angegeben werden. Beispiel:

ORDER BY column_3, column_4

Nutzungshinweise

  • Aus Gründen der Kompatibilität mit Implementierungen dieser Funktion in anderen Systemen kann { IGNORE | RESPECT } NULLS auch in den Argumenten der folgenden Funktion angegeben werden:

    FIRST_VALUE( <Ausdruck> [ { IGNORE | RESPECT } NULLS ] ) OVER ...

  • Wenn { IGNORE | RESPECT } NULLS nicht angegeben ist, lautet der Standardwert RESPECT NULLS (d. h. es wird ein NULL-Wert zurückgegeben, wenn der Ausdruck einen NULL-Wert enthält und es sich dabei um den ersten Wert im Ausdruck handelt).

  • Diese Funktion ist eine rangbezogene Analysefunktion, d. h. sie muss ein Fenster angeben. Eine Fensterklausel besteht aus den folgenden Unterklauseln:

    • Unterklausel PARTITION BY <Ausdruck1> (optional)

    • Unterklausel ORDER BY <Ausdruck2> (erforderlich) Weitere Informationen zu zusätzlich unterstützten Sortieroptionen (Sortierreihenfolge, Sortieren von NULL-Werten usw.) finden Sie in der Dokumentation zum Abfragekonstrukt ORDER BY, das denselben Regeln folgt.

    • Unterklausel window_frame (optional)

  • Die Reihenfolge der Zeilen in einem Fenster (und damit das Ergebnis der Abfrage) ist nur dann vollständig deterministisch, wenn durch die Schlüssel in der ORDER BY-Klausel jede Zeile eindeutig identifizierbar ist. Betrachten Sie das folgende Beispiel:

    ... OVER (PARTITION BY p ORDER BY o COLLATE 'lower') ...
    

    Das Abfrageergebnis kann variieren, wenn eine Partition Werte der Spalte o enthält, die identisch sind oder bei einem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung identisch wären.

  • Die ORDER BY-Klausel innerhalb der OVER-Klausel steuert die Reihenfolge der Zeilen nur innerhalb des Fensters, nicht die Reihenfolge der Zeilen in der Ausgabe der gesamten Abfrage. Um die Reihenfolge der Ausgabe zu steuern, verwenden Sie eine separate ORDER BY-Klausel auf der äußersten Ebene der Abfrage.

  • Der optionale window_frame (kumulativ oder gleitend) gibt die Teilmenge der Zeilen innerhalb des Fensters an, für die die Funktion berechnet wird. Wenn kein window_frame angegeben ist, ist der Standard das gesamte Fenster:

    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

    Beachten Sie, dass dies vom ANSI-Standard abweicht, der folgenden Standard für Fensterrahmen vorgibt:

    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    Weitere Informationen zu Fensterrahmen, einschließlich Syntax und Beispiele, finden Sie unter Syntax und Nutzung von Fensterrahmen.

Beispiele

Dies zeigt eine einfache Abfrage mit FIRST_VALUE() an. Diese Abfrage enthält zwei ORDER BY-Unterklauseln, eine zur Steuerung der Reihenfolge der Zeilen in jeder Partition und eine zur Steuerung der Reihenfolge der Ausgabe der vollständigen Abfrage.

SELECT
        column1,
        column2,
        FIRST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2 NULLS LAST) AS column2_first
    FROM VALUES
       (1, 10), (1, 11), (1, null), (1, 12),
       (2, 20), (2, 21), (2, 22)
    ORDER BY column1, column2;
+---------+---------+---------------+
| COLUMN1 | COLUMN2 | COLUMN2_FIRST |
|---------+---------+---------------|
|       1 |      10 |            10 |
|       1 |      11 |            10 |
|       1 |      12 |            10 |
|       1 |    NULL |            10 |
|       2 |      20 |            20 |
|       2 |      21 |            20 |
|       2 |      22 |            20 |
+---------+---------+---------------+

Die nächste Abfrage stellt die Ausgaben von FIRST_VALUE, NTH_VALUE und LAST_VALUE gegenüber. Beachten Sie Folgendes:

  • Die Abfrage erstellt einen gleitenden Fensterrahmen, der drei Zeilen breit ist und Folgendes enthält:

    • Die Zeile, die der aktuellen Zeile vorausgeht.

    • Die aktuelle Zeile.

    • Die Zeile, die auf die aktuelle Zeile folgt.

  • Die 2 im Aufruf NTH_VALUE(i, 2) gibt die zweite Zeile im Fensterrahmen an (die in diesem Fall auch die aktuelle Zeile ist).

  • Wenn die aktuelle Zeile die allererste Zeile im Fensterrahmen ist, gibt es keine vorherige Zeile, auf die verwiesen werden kann, sodass FIRST_VALUE() einen NULL-Wert für diese Zeile zurückgibt.

SELECT
        partition_col, order_col, i,
        FIRST_VALUE(i)  OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS FIRST_VAL,
        NTH_VALUE(i, 2) OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS NTH_VAL,
        LAST_VALUE(i)   OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LAST_VAL
    FROM demo1
    ORDER BY partition_col, i, order_col;
+---------------+-----------+---+-----------+---------+----------+
| PARTITION_COL | ORDER_COL | I | FIRST_VAL | NTH_VAL | LAST_VAL |
|---------------+-----------+---+-----------+---------+----------|
|             1 |         1 | 1 |      NULL |       1 |        2 |
|             1 |         2 | 2 |         1 |       2 |        3 |
|             1 |         3 | 3 |         2 |       3 |        4 |
|             1 |         4 | 4 |         3 |       4 |        5 |
|             1 |         5 | 5 |         4 |       5 |        5 |
|             2 |         1 | 1 |      NULL |       1 |        2 |
|             2 |         2 | 2 |         1 |       2 |        3 |
|             2 |         3 | 3 |         2 |       3 |        4 |
|             2 |         4 | 4 |         3 |       4 |        4 |
+---------------+-----------+---+-----------+---------+----------+
Zurück zum Anfang