SQL Server: función de retraso

Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.

SQL Server: función de retraso

Este tutorial de Oracle describe cómo usar SQL Server (Transact-SQL) función de histéresis Con sintaxis y ejemplos.

describir

En SQL Server (Transact-SQL), la función LAG es una función analítica que le permite consultar varias filas de una tabla a la vez sin unir la tabla a sí misma. Devuelve el valor de la fila anterior de la tabla. Para devolver un valor de la siguiente fila, intente usar la función LEAD.

sintaxis

La sintaxis de la función LAG en SQL Server (Transact-SQL) es:

LAG ( expression [, offset [, default] ] )
OVER ( [ query_partition_clause ] order_by_clause )

parámetro o parámetro

Las expresiones pueden contener expresiones de otras funciones integradas, pero pueden No Contiene cualquier función analítica. El desplazamiento es opcional. Es el desplazamiento físico de la fila actual en la tabla. Si se omite este parámetro, el valor predeterminado es 1. predeterminado opcional. Este valor se devuelve si el desplazamiento está fuera de los límites de la tabla. Si se omite este parámetro, por defecto está vacío. cláusula_partición_consulta Opcional. Se utiliza para dividir los resultados en grupos basados ​​en una o más expresiones. order_by_clause opcional. Se utiliza para ordenar los datos dentro de cada partición.

aplicar para

La función LAG está disponible en las siguientes versiones de SQL Server (Transact-SQL):

  • Servidor SQL 2017, Servidor SQL 2016, Servidor SQL 2014, Servidor SQL 2012

Ejemplo de DDL/DML

Si desea seguir este tutorial, obtenga DDL para crear las tablas y DML para completar los datos. ¡Entonces pruebe los ejemplos en su propia base de datos!

ejemplo

Las funciones LAG están disponibles para SQL Server (Transact-SQL).

Veamos un ejemplo. Si tenemos una tabla de empleados con los siguientes datos:

ID de empleado apellido nombre salario dept_id
12009 Sutherland Bárbara 54000 45
34974 Yates Fred 80000 45
34987 Erickson neil 42000 45
45001 parker Salida 57500 30
75623 puertas Steve 65000 30

Ejecutamos la siguiente instrucción SQL:

SELECT dept_id, last_name, salary,
LAG (salary,1) OVER (ORDER BY salary) AS lower_salary
FROM employees;

Devolverá los siguientes resultados:

dept_id apellido salario salario bajo
45 Erickson 42000 nulo
45 Sutherland 54000 42000
30 parker 57500 54000
30 puertas 65000 57500
45 Yates 80000 65000

En este ejemplo, la función LAG ordenará todos los valores de salario en la tabla de empleados en orden ascendente, luego devolverá el salario que está 1 posición más abajo en el conjunto de resultados porque usamos la compensación 1.

Si, en cambio, usáramos una compensación de 2, arrojaría un salario 2 salarios más bajo. Si hubiéramos utilizado una compensación de 3, habría devuelto un salario 3 más bajo… y así sucesivamente.

usar partición

Ahora veamos un ejemplo más complejo donde usamos una cláusula de partición de consulta para devolver el salario más bajo de cada empleado dentro de su propio departamento.

Ingrese la siguiente instrucción SQL:

SELECT dept_id, last_name, salary,
LAG (salary,1) OVER (PARTITION BY dept_id ORDER BY salary) AS lower_salary
FROM employees;

Devolverá los siguientes resultados:

dept_id apellido salario salario bajo
30 parker 57500 nulo
30 puertas 65000 57500
45 Erickson 42000 nulo
45 Sutherland 54000 42000
45 Yates 80000 54000

En este ejemplo, la función LAG dividirá los resultados por dept_id y luego ordenará por salario como se muestra a continuación. PARTITION BY dept_id ORDER BY salaryEsto significa que la función LAG solo evaluará el valor del salario si el dept_id coincide con el dept_id del registro actual. Cuando se encuentra un nuevo dept_id, la función LAG reiniciará el cálculo y la partición con el dept_id adecuado.

Como puede ver, el primer registro en el conjunto de resultados tiene un valor NULL para lower_salary porque es el primer registro de la partición con dept_id 30 (ordenado por salario), por lo que no hay un valor de salario inferior. Lo mismo ocurre con el tercer registro con un dept_id de 45.