- Kategorien:
Fensterfunktionen (Rangbezogen, Fensterrahmen)
LAST_VALUE¶
Gibt den letzten Wert innerhalb einer geordneten Gruppe von Werten zurück.
- Siehe auch:
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 StandardwertRESPECT 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 optionalenFensterrahmen
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 AufrufNTH_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 |
+---------------+-----------+---+-----------+---------+----------+