Atrás

Funciones analíticas en ORACLE

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

 

¿Conectamos?

Da un paso adelante con nosotros
suscribete a nuestro newsletter

Suscripción

Últimos posts publicados