- Kategorien:
Syntax und Verwendung von Fensterfunktionen (Rangliste)
LAG¶
Greift auf Daten in einer früheren Zeile desselben Resultsets zu, ohne dass die Tabelle mit sich selbst verknüpft werden muss.
- Siehe auch:
Syntax¶
LAG ( <expr> [ , <offset> , <default> ] ) [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Argumente¶
expr
Der Ausdruck, der auf Basis des angegebenen Offsets zurückgegeben wird.
offset
Die Anzahl der Zeilen rückwärts von der aktuellen Zeile, aus der ein Wert ermittelt werden soll. Beispielsweise gibt
offset
von 2 den Wertexpr
mit einem Intervall von 2 Zeilen zurück.Hinweis: Das Einrichten eines negativen Offsets hat dieselbe Wirkung wie die Verwendung der Funktion LEAD.
Der Standardwert ist 1.
default
Der Ausdruck, der zurückgegeben wird, wenn der Offset die Grenzen des Fensters überschreitet. Unterstützt jeden Ausdruck, dessen Typ mit
expr
kompatibel ist.Der Standardwert ist NULL.
{ IGNORE | RESPECT } NULLS
Ob die NULL-Werte ignoriert oder beachtet werden sollen, wenn
expr
NULL-Werte enthält:IGNORE NULLS
schließt jede Zeile aus, deren Ausdruck bei der Zählung der Offset-Zeilen den Wert NULL ergibt.RESPECT NULLS
enthält jede Zeile, deren Ausdruck bei der Zählung der Offset-Zeilen den Wert NULL ergibt.
Standard:
RESPECT NULLS
Nutzungshinweise¶
Die PARTITIONBY-Klausel unterteilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die Funktion angewendet wird. Weitere Informationen dazu finden Sie unter Syntax und Verwendung von Fensterfunktionen.
Die ORDERBY-Klausel ordnet die Daten in einzelne Partitionen an.
Beispiele¶
Erstellen Sie die Tabelle, und laden Sie die Daten:
CREATE OR REPLACE TABLE sales(
emp_id INTEGER,
year INTEGER,
revenue DECIMAL(10,2));
INSERT INTO sales VALUES
(0, 2010, 1000),
(0, 2011, 1500),
(0, 2012, 500),
(0, 2013, 750);
INSERT INTO sales VALUES
(1, 2010, 10000),
(1, 2011, 12500),
(1, 2012, 15000),
(1, 2013, 20000);
INSERT INTO sales VALUES
(2, 2012, 500),
(2, 2013, 800);
Diese Abfrage gibt die Differenz zwischen dem diesjährigen Umsatz und dem Vorjahresumsatz wieder:
SELECT emp_id, year, revenue,
revenue - LAG(revenue, 1, 0) OVER (PARTITION BY emp_id ORDER BY year) AS diff_to_prev
FROM sales
ORDER BY emp_id, year;
+--------+------+----------+--------------+
| EMP_ID | YEAR | REVENUE | DIFF_TO_PREV |
|--------+------+----------+--------------|
| 0 | 2010 | 1000.00 | 1000.00 |
| 0 | 2011 | 1500.00 | 500.00 |
| 0 | 2012 | 500.00 | -1000.00 |
| 0 | 2013 | 750.00 | 250.00 |
| 1 | 2010 | 10000.00 | 10000.00 |
| 1 | 2011 | 12500.00 | 2500.00 |
| 1 | 2012 | 15000.00 | 2500.00 |
| 1 | 2013 | 20000.00 | 5000.00 |
| 2 | 2012 | 500.00 | 500.00 |
| 2 | 2013 | 800.00 | 300.00 |
+--------+------+----------+--------------+
Erstellen Sie eine weitere Tabelle, und laden Sie die Daten:
CREATE OR REPLACE TABLE t1 (
col_1 NUMBER,
col_2 NUMBER);
INSERT INTO t1 VALUES
(1, 5),
(2, 4),
(3, NULL),
(4, 2),
(5, NULL),
(6, NULL),
(7, 6);
Diese Abfrage zeigt, wie sich die IGNORE NULLS-Klausel auf die Ausgabe auswirkt. Alle Zeilen (mit Ausnahme der ersten) enthalten Nicht-NULL-Werte, selbst wenn die vorherige Zeile NULL enthielt. Wenn die vorhergehende Zeile NULL enthielt, verwendet die aktuelle Zeile den letzten Nicht-NULL-Wert.
SELECT col_1,
col_2,
LAG(col_2) IGNORE NULLS OVER (ORDER BY col_1)
FROM t1
ORDER BY col_1;
+-------+-------+-----------------------------------------------+
| COL_1 | COL_2 | LAG(COL_2) IGNORE NULLS OVER (ORDER BY COL_1) |
|-------+-------+-----------------------------------------------|
| 1 | 5 | NULL |
| 2 | 4 | 5 |
| 3 | NULL | 4 |
| 4 | 2 | 4 |
| 5 | NULL | 2 |
| 6 | NULL | 2 |
| 7 | 6 | 2 |
+-------+-------+-----------------------------------------------+