Funciones analíticas en ORACLE

Nov 6, 2014 | TIC-tek

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

Catálogo 2021

Conoce nuestra oferta formativa para este año

Últimas entradas