Kategorien:

Fensterfunktionen (Rangbezogen, Fensterrahmen)

LAST_VALUE

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

Siehe auch:

FIRST_VALUE, NTH_VALUE

Syntax

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

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

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:

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

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

  • Da LAST_VALUE eine rangbezogene Analysefunktion ist, muss ein Fenster angegeben werden, das aus folgenden Elementen besteht:

    • Unterklausel PARTITION BY <Ausdruck1> (optional)

    • Unterklausel ORDER BY <Ausdruck2> (erforderlich) mit einem optionalen Fensterrahmen Weitere Informationen zu zusätzlich unterstützten Sortieroptionen (Sortierreihenfolge, Sortieren von NULL-Werten usw.) finden Sie im Abfragekonstrukt ORDER BY.

  • Der optionale Fensterrahmen (kumulativ oder gleitend) gibt die Teilmenge der Zeilen innerhalb des Fensters an, für die die Funktion berechnet wird.

    • Für Fensterrahmen unterstützt diese Funktion nur ROWS-basierte Fensterrahmen, nicht RANGE-basierte Fensterrahmen.

      Unterstützt

      ROWS BETWEEN ... AND ...

      Nicht unterstützt

      RANGE BETWEEN ... AND ...

    • Wenn kein Fensterrahmen angegeben ist, ist der Standard das gesamte Fenster:

      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

      Dies unterscheidet sich vom ANSI-Standard, der Folgendes für Fensterrahmen vorgibt:

      RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    Weitere Informationen zu Fensterrahmen, einschließlich Syntax und Beispiele, finden Sie unter Fensterrahmensyntax und Verwendung.

Beispiele

SELECT
    column1,
    column2,
    LAST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2) AS column2_last
FROM VALUES
    (1, 10), (1, 11), (1, 12),
    (2, 20), (2, 21), (2, 22);

+---------+---------+--------------+
| COLUMN1 | COLUMN2 | COLUMN2_LAST |
|---------+---------+--------------|
|       1 |      10 |           12 |
|       1 |      11 |           12 |
|       1 |      12 |           12 |
|       2 |      20 |           22 |
|       2 |      21 |           22 |
|       2 |      22 |           22 |
+---------+---------+--------------+

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 |
+---------------+-----------+---+-----------+---------+----------+