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.

