Uso de la funciones LAG/LEAD
Dos de las funciones analíticas que introduce Oracle en su lenguaje SQL son LAG y LEAD, que permiten obtener el valor de la fila anterior y posterior respectivamente. Esta funcionalidad es sumamente útil en operaciones de análisis de datos. Sintaxis:
Ejemplo: El siguiente ejemplo muestra el campo empno y ordenando por dicho campo visualiza el valor de empno del anterior registro (id_previo) y del posterior (id_posterior).
SQL> SELECT empno,
LAG(empno) OVER (ORDER BY empno) id_previo,
LEAD(empno) OVER (ORDER BY empno) id_posterior
FROM emp;
EMPNO ID_PREVIO ID_POSTERIOR
---------- ---------- ------------
7369 7499
7499 7369 7521
7521 7499 7566
7566 7521 7654
7654 7566 7698
7698 7654 7782
7782 7698 7788
7788 7782 7839
7839 7788 7844
7844 7839 7876
7876 7844 7900
7900 7876 7902
7902 7900 7934
7934 7902
Uso de la funciones FIRST/LAST
Las funciones analíticas de Oracle FIRST/LAST obtienen el primer valor y el último de un conjunto de datos ordenados por una expresión. Sintaxis:
Ejemplos: El siguiente ejemplo devuelve, dentro de cada departamento de la tabla de emp, el salario mínimo entre los empleados que tienen la comisión más baja y el salario máximo entre los empleados que tienen la comisión más alta.
SQL> SELECT deptno,
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY comm) primero,
MAX(sal) KEEP (DENSE_RANK LAST ORDER BY comm) ultimo
FROM emp
GROUP BY deptno;
DEPTNO PRIMERO ULTIMO
---------- ---------- ----------
10 1300 5000
20 800 3000
30 1500 2850
Este ejemplo hace el mismo cálculo que el anterior, pero devuelve el resultado para cada empleado en el departamento:
SQL> SELECT ename, deptno, sal,
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY comm)
OVER (PARTITION BY deptno) primero,
MAX(sal) KEEP (DENSE_RANK LAST ORDER BY comm)
OVER (PARTITION BY deptno) ultimo
FROM emp
ORDER BY deptno, sal;
ENAME DEPTNO SAL PRIMERO ULTIMO
---------- ---------- ---------- ---------- ----------
MILLER 10 1300 1300 5000
CLARK 10 2450 1300 5000
KING 10 5000 1300 5000
SMITH 20 800 800 3000
ADAMS 20 1100 800 3000
JONES 20 2975 800 3000
SCOTT 20 3000 800 3000
FORD 20 3000 800 3000
JAMES 30 950 1500 2850
MARTIN 30 1250 1500 2850
WARD 30 1250 1500 2850
TURNER 30 1500 1500 2850
ALLEN 30 1600 1500 2850
BLAKE 30 2850 1500 2850