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 salary
Esto 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.