- 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 - offsetvon 2 den Wert- exprmit 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 - exprkompatibel ist.- Der Standardwert ist NULL. 
- { IGNORE | RESPECT } NULLS
- Ob die NULL-Werte ignoriert oder beachtet werden sollen, wenn - exprNULL-Werte enthält:- IGNORE NULLSschließt jede Zeile aus, deren Ausdruck bei der Zählung der Offset-Zeilen den Wert NULL ergibt.
- RESPECT NULLSenthä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 |
+-------+-------+-----------------------------------------------+