LEAD (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric
Tiene acceso a datos de una fila posterior en el mismo conjunto de resultados sin usar una autocombinación que empieza por SQL Server 2012 (11.x). LEAD
proporciona acceso a una fila en un desplazamiento físico determinado que sigue a la fila actual. Use esta función analítica en una SELECT
instrucción para comparar los valores de la fila actual con valores de una fila siguiente.
Convenciones de sintaxis de Transact-SQL
Sintaxis
LEAD ( scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause )
Argumentos
scalar_expression
El valor que se va a devolver en función del desplazamiento especificado. Es una expresión de cualquier tipo que devuelve un valor único (escalar). scalar_expression no puede ser una función analítica.
offset
El número de filas hacia delante de la fila actual de la que se va a obtener un valor. Si no se especifica, el valor predeterminado es 1. offset puede ser una columna, una subconsulta u otra expresión que se evalúa como un entero positivo o que se puede convertir implícitamente en bigint. offset no puede ser un valor negativo ni una función analítica.
default
Valor que se devuelve cuando offset está fuera del ámbito de la partición. Si no se especifica un valor predeterminado, NULL
se devuelve. el valor predeterminado puede ser una columna, una subconsulta u otra expresión, pero no puede ser una función analítica. default debe tener un tipo compatible con scalar_expression.
[ IGNORE NULLS | RESPECT NULLS ]
Se aplica a: SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database, Azure SQL Instancia administrada, Azure SQL Edge
IGNORE NULLS
: se omiten NULL
los valores del conjunto de datos al calcular el primer valor en una partición.
RESPECT NULLS
: respeta los NULL
valores del conjunto de datos al calcular el primer valor en una partición. RESPECT NULLS
es el comportamiento predeterminado si no se especifica una NULLS
opción.
Se ha corregido un error en SQL Server 2022 CU4 relacionado con IGNORE NULLS
en LAG
y LEAD
.
Para más información sobre este argumento en Azure SQL Edge, consulte Imputación de valores que faltan.
OVER ( [ partition_by_clause ] order_by_clause )
partition_by_clause divide el conjunto de resultados generado por la
FROM
cláusula en particiones a las que se aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo.order_by_clause determina el orden de los datos antes de que se aplique la función.
Cuando se especifica partition_by_clause, determina el orden de los datos en cada partición. order_by_clause es obligatorio. Para obtener más información, vea SELECT - OVER Clause.
Tipos de valores devueltos
El tipo de datos de la scalar_expression especificada. NULL
se devuelve si scalar_expression admite valores NULL o el valor predeterminado se establece en NULL
.
LEAD
sea no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.
Ejemplos
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
A Comparar valores entre años
La consulta usa la LEAD
función para devolver la diferencia en las cuotas de ventas de un empleado específico durante los años posteriores. Dado que no hay ningún valor de cliente potencial disponible para la última fila, se devuelve el valor predeterminado de cero (0).
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
YEAR(QuotaDate) AS SalesYear,
SalesQuota AS CurrentQuota,
LEAD(SalesQuota, 1, 0) OVER (ORDER BY YEAR(QuotaDate)) AS NextQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 AND YEAR(QuotaDate) IN ('2005', '2006');
Este es el conjunto de resultados.
BusinessEntityID SalesYear CurrentQuota NextQuota
---------------- ----------- --------------------- ---------------------
275 2005 367000.00 556000.00
275 2005 556000.00 502000.00
275 2006 502000.00 550000.00
275 2006 550000.00 1429000.00
275 2006 1429000.00 1324000.00
275 2006 1324000.00 0.00
B. Comparar valores dentro de particiones
En el ejemplo siguiente se usa la LEAD
función para comparar las ventas de año a fecha entre los empleados. La PARTITION BY
cláusula se especifica para particionar las filas del conjunto de resultados por territorio de ventas. La LEAD
función se aplica a cada partición por separado y se reinicia el cálculo para cada partición. La ORDER BY
cláusula especificada en la OVER
cláusula ordena las filas de cada partición antes de aplicar la función. La ORDER BY
cláusula de la SELECT
instrucción ordena las filas del conjunto de resultados completo. Dado que no hay ningún valor de cliente potencial disponible para la última fila de cada partición, se devuelve el valor predeterminado de cero (0).
USE AdventureWorks2022;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD,
LEAD (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS NextRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada')
ORDER BY TerritoryName;
Este es el conjunto de resultados.
TerritoryName BusinessEntityID SalesYTD NextRepSales
----------------------- ---------------- --------------------- ---------------------
Canada 282 2604540.7172 1453719.4653
Canada 278 1453719.4653 0.00
Northwest 284 1576562.1966 1573012.9383
Northwest 283 1573012.9383 1352577.1325
Northwest 280 1352577.1325 0.00
C. Especificar expresiones arbitrarias
En el ejemplo siguiente se muestra cómo especificar varias expresiones arbitrarias e ignorar NULL
valores en la sintaxis de la LEAD
función.
CREATE TABLE T (a INT, b INT, c INT);
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);
SELECT b, c,
LEAD(2 * c, b * (SELECT MIN(b) FROM T), -c / 2.0) IGNORE NULLS OVER (ORDER BY a) AS i
FROM T;
Este es el conjunto de resultados.
b c i
----------- ----------- -----------
1 5 -2
2 NULL NULL
3 1 0
1 NULL 2
2 4 2
1 -3 8
D. Use IGNORE NULLS para buscar valores que no son NULL
La siguiente consulta de ejemplo muestra el uso del IGNORE NULLS
argumento .
El IGNORE NULLS
argumento se usa tanto con LAG LEAD
como para demostrar la sustitución de valores para valores anteriores o distintos de NULL
NULL.
- Si la fila anterior contiene
NULL
LAG
, la fila actual usa el valor distinto de más recienteNULL
. - Si la fila siguiente contiene con
NULL
LEAD
, la fila actual usa el siguiente valor no disponibleNULL
.
DROP TABLE IF EXISTS #test_ignore_nulls;
CREATE TABLE #test_ignore_nulls (column_a int, column_b int);
GO
INSERT INTO #test_ignore_nulls VALUES
(1, 8),
(2, 9),
(3, NULL),
(4, 10),
(5, NULL),
(6, NULL),
(7, 11);
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) IGNORE NULLS OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) IGNORE NULLS OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--cleanup
DROP TABLE #test_ignore_nulls;
column_a column_b Previous value for column_b Next value for column_b
------------ ----------- ------------------------------ ------------------------
1 8 NULL 9
2 9 8 10
3 NULL 9 10
4 10 9 11
5 NULL 10 11
6 NULL 10 11
7 11 10 NULL
E. Uso de RESPECT NULLS para mantener NULL
los valores
La siguiente consulta de ejemplo muestra el uso del RESPECT NULLS
argumento , que es el comportamiento predeterminado si no se especifica, en lugar del IGNORE NULLS
argumento del ejemplo anterior.
- Si la fila anterior contiene
NULL
LAG
, la fila actual usa el valor más reciente. - Si la fila siguiente contiene con
NULL
LEAD
, la fila actual usa el siguiente valor.
DROP TABLE IF EXISTS #test_ignore_nulls;
CREATE TABLE #test_ignore_nulls (column_a int, column_b int);
GO
INSERT INTO #test_ignore_nulls VALUES
(1, 8),
(2, 9),
(3, NULL),
(4, 10),
(5, NULL),
(6, NULL),
(7, 11);
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) RESPECT NULLS OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) RESPECT NULLS OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--Identical output
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--cleanup
DROP TABLE #test_ignore_nulls;
column_a column_b Previous value for column_b Next value for column_b
1 8 NULL 9
2 9 8 NULL
3 NULL 9 10
4 10 NULL NULL
5 NULL 10 NULL
6 NULL NULL 11
7 11 NULL NULL
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
A Comparar valores entre trimestres
En el ejemplo siguiente se muestra la LEAD
función . La consulta obtiene la diferencia en los valores de cuota de ventas para un determinado empleado durante trimestres naturales consecutivos. Dado que no hay ningún valor de cliente potencial disponible después de la última fila, se usa el valor predeterminado de cero (0).
-- Uses AdventureWorks
SELECT CalendarYear AS Year,
CalendarQuarter AS Quarter,
SalesAmountQuota AS SalesQuota,
LEAD(SalesAmountQuota, 1, 0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS NextQuota,
SalesAmountQuota - LEAD(SalesAmountQuota, 1, 0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear IN (2001, 2002)
ORDER BY CalendarYear, CalendarQuarter;
Este es el conjunto de resultados.
Year Quarter SalesQuota NextQuota Diff
---- ------- ---------- --------- -------------
2001 3 28000.0000 7000.0000 21000.0000
2001 4 7000.0000 91000.0000 -84000.0000
2001 1 91000.0000 140000.0000 -49000.0000
2002 2 140000.0000 7000.0000 7000.0000
2002 3 7000.0000 154000.0000 84000.0000
2002 4 154000.0000 0.0000 154000.0000