Funciones Oracle: LAG y LEAD
Con las funciones LAG() y LEAD() se obtienen el valor anterior o posterior en una lista ordenada. Con estas funciones se evita la necesidad de realizar un join con la misma tabla.
LAG: Obtendría el valor del registro anterior
LEAD: Obtendría el valor del registro posterior
SINTAXIS:
función (<expresion_valor_1> [,<offset> [, <valor_por_defecto> ]]) OVER ([PARTITION BY <expresion_valor_3> [,<expresion_valor_4>, ...]]) ORDER BY <expresion_valor_2> [ASC|DESC] [NULLS FIRST | NULLS LAST] [,…])
función – LAG o LEAD
Expresion_valor_1 – Puede ser una columna u otra función no analítica a obtener
Expresion_valor_3, Expresion_valor_4, … – Puede ser una columna u otra función no analítica a obtener
Expresion_valor_1 – Puede ser una columna u otra función no analítica a obtener
offset – Número de registros anteriores o posteriores al registro en curso. Por defecto 1.
valor_por_defecto – Valor que toma, si se sale del rango. Por ejemplo, si se evalua primer registro y se intenta obtener dato de uno anterior. Por defecto es nulo.
EJEMPLO 1: LAG y LEAD
CREATE TABLE tabla (clave NUMBER, cantidad NUMBER, nombre VARCHAR2(100)); INSERT INTO tabla (clave, cantidad, nombre) VALUES (1,1,'Luis'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (2,1,'Carlos'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (3,2,'Elena'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (4,NULL, 'Luisa'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (5,NULL,'Jacobo'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (6,1,'Carmen'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (7,2,'Mercedes'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (9,1,'Pepe'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (10,1,'Amelia'); INSERT INTO tabla (clave, cantidad, nombre) VALUES (11,3,'Jose'); commit; SELECT clave, cantidad, nombre, LAG(nombre,1,'--') OVER (PARTITION BY cantidad order by clave) nombre_siguiente, LAG(nombre,2,'--') OVER (PARTITION BY cantidad order by clave) nombre_2siguiente, LEAD(nombre,1,'--') OVER (PARTITION BY cantidad order by clave) nombre_anterior FROM tabla ORDER BY cantidad, clave;
CLAVE | CANTIDAD | NOMBRE | NOMBRE_SIGUIENTE | NOMBRE_2SIGUIENTE | NOMBRE_ANTERIOR |
---|---|---|---|---|---|
1
|
1
|
Luis | — | — | Carlos |
2
|
1
|
Carlos | Luis | — | Carmen |
6
|
1
|
Carmen | Carlos | Luis | Pepe |
9
|
1
|
Pepe | Carmen | Carlos | Amelia |
10
|
1
|
Amelia | Pepe | Carmen | — |
3
|
2
|
Elena | — | — | Mercedes |
7
|
2
|
Mercedes | Elena | — | — |
11
|
3
|
Jose | — | — | — |
4
|
Luisa | — | — | Jacobo | |
5
|
Jacobo | Luisa | — | — |
EJEMPLO 2: Comprobar continuidad
CREATE TABLE tabla2 (clave NUMBER, fecha DATE); INSERT INTO tabla2 (clave, fecha) VALUES (1,TO_DATE('02/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (2,TO_DATE('03/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (3,TO_DATE('04/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (4,TO_DATE('06/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (5,TO_DATE('07/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (6,TO_DATE('08/01/2016','dd/mm/yyyy')); INSERT INTO tabla2 (clave, fecha) VALUES (7,TO_DATE('09/01/2016','dd/mm/yyyy')); commit; SELECT clave, fecha, LAG(fecha, 1, TO_DATE('01/01/2016','dd/mm/yyyy')) OVER (order by clave) clave_siguiente, DECODE(fecha, LAG(fecha, 1, TO_DATE('01/01/2016','dd/mm/yyyy')) OVER (order by clave) +1, 'OK', 'KO') continuidad_fecha FROM tabla2 ORDER BY fecha, clave;
CLAVE | FECHA | CLAVE_SIGUIENTE | CONTINUIDAD_FECHA |
---|---|---|---|
1
|
02/01/2016 | 01/01/2016 | OK |
2
|
03/01/2016 | 02/01/2016 | OK |
3
|
04/01/2016 | 03/01/2016 | OK |
4
|
06/01/2016 | 04/01/2016 | KO |
5
|
07/01/2016 | 06/01/2016 | OK |
6
|
08/01/2016 | 07/01/2016 | OK |
7
|
09/01/2016 | 08/01/2016 | OK |
Comments are closed.