Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL 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.
[ IGNORAR NULOS | RESPETO NULO ]
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.
CAMBIO ( [ partition_by_clause ] order_by_clause )
partition_by_clause divide el conjunto de resultados generado por la
FROMclá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.
NULLse devuelve si .
LEAD sea no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.
Ejemplos
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
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 LAGpara demostrar la sustitución de valores para valores anteriores o distintos de LEAD NULL.
- Si la fila anterior contiene
NULLLAG, la fila actual usa el valor distinto de más recienteNULL. - Si la fila siguiente contiene con
NULLLEAD, 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
NULLLAG, la fila actual usa el valor más reciente. - Si la fila siguiente contiene con
NULLLEAD, 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