Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Toegang tot gegevens uit een volgende rij in dezelfde resultaatset zonder gebruik te maken van een zelf-join vanaf SQL Server 2012 (11.x).
LEAD biedt toegang tot een rij bij een bepaalde fysieke offset die volgt op de huidige rij. Gebruik deze analytische functie in een SELECT statement om waarden in de huidige rij te vergelijken met waarden in een volgende rij.
Transact-SQL syntaxis-conventies
Syntaxis
LEAD ( scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause )
Arguments
scalar_expression
De te retourneren waarde gebaseerd op de gespecificeerde offset. Het is een uitdrukking van elk type die één enkele (scalaire) waarde teruggeeft. scalar_expression kan geen analytische functie zijn.
afstand
Het aantal rijen vooruit vanaf de huidige rij waaruit een waarde wordt verworpen. Als dit niet is opgegeven, is de standaardwaarde 1. offset kan een kolom-, subquery- of andere expressie zijn die evalueert naar een positief geheel getal of impliciet kan worden omgezet in bigint. Offset kan geen negatieve waarde of analytische functie zijn.
standaard
De waarde die moet worden teruggegeven bij offset valt buiten het bereik van de partitie. Als er geen standaardwaarde is opgegeven, NULL wordt deze teruggegeven.
Default kan een kolom, subquery of andere expressie zijn, maar het kan geen analytische functie zijn.
standaard moet type-compatibel zijn met scalar_expression.
[ NULL-WAARDEN NEGEREN | RESPECT NULLS ]
Van toepassing op: SQL Server 2022 (16.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, Azure SQL Edge
IGNORE NULLS - Negeer NULL waarden in de dataset bij het berekenen van de eerste waarde over een partitie.
RESPECT NULLS - Respecteer NULL waarden in de dataset bij het berekenen van de eerste waarde over een partitie.
RESPECT NULLS is het standaardgedrag als er geen NULLS optie is gespecificeerd.
Er was een bugfix in SQL Server 2022 CU4 gerelateerd aan IGNORE NULLS in LAG en LEAD.
Zie Ontbrekende waardeninvoeren voor meer informatie over dit argument in Azure SQL Edge.
OVER ( [ partition_by_clause ] order_by_clause )
partition_by_clause verdeelt de resultatenset die door de
FROMcomponent wordt geproduceerd in partities waarop de functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep.order_by_clause bepaalt de volgorde van de data voordat de functie wordt toegepast.
Wanneer partition_by_clause wordt gespecificeerd, bepaalt het de volgorde van de gegevens in elke partitie. De order_by_clause is vereist. Voor meer informatie, zie SELECT - OVER Clause.
Retourtypen
Het datatype van de gespecificeerde scalar_expression.
NULL wordt teruggegeven als scalar_expression ongeldig is of standaard is ingesteld op NULL.
LEAD is niet-deterministisch. Zie Deterministische en niet-deterministische functies voor meer informatie.
Voorbeelden
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
Eén. Vergelijk waarden tussen jaren
De zoekopdracht gebruikt de LEAD functie om het verschil in verkoopquota voor een specifieke werknemer over daaropvolgende jaren terug te geven. Omdat er geen leadwaarde beschikbaar is voor de laatste rij, wordt de standaard nul (0) teruggegeven.
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');
Hier is het resultatenoverzicht.
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. Vergelijk waarden binnen partities
Het volgende voorbeeld gebruikt de LEAD functie om jaar-op-datum verkopen tussen werknemers te vergelijken. De PARTITION BY clausule is gespecificeerd om de rijen in de resultaatset te verdelen per verkoopgebied. De LEAD functie wordt afzonderlijk op elke partitie toegepast en de berekening wordt voor elke partitie opnieuw gestart. De ORDER BY clausule die in de OVER clausule is gespecificeerd, ordent de rijen in elke partitie voordat de functie wordt toegepast. De ORDER BY clausule in de SELECT stelling ordent de rijen in de hele resultaatset. Omdat er geen leadwaarde beschikbaar is voor de laatste rij van elke partitie, wordt de standaard nul (0) teruggegeven.
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;
Hier is het resultatenoverzicht.
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. Specificeer willekeurige expressies
Het volgende voorbeeld toont het specificeren van verschillende willekeurige expressies en het negeren NULL van waarden in de LEAD functiesyntaxis.
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;
Hier is het resultatenoverzicht.
b c i
----------- ----------- -----------
1 5 -2
2 NULL NULL
3 1 0
1 NULL 2
2 4 2
1 -3 8
D. Gebruik IGNOREER NULLS om niet-NULL-waarden te vinden
De volgende voorbeeldquery demonstreert het gebruik van het IGNORE NULLS argument.
Het IGNORE NULLS argument wordt gebruikt met zowel LAG als LEAD om substitutie van NULL waarden voor voorafgaande of volgende niet-NULL-waarden aan te tonen.
- Als de voorgaande rij bevat
NULLmetLAG, dan gebruikt de huidige rij de meest recente niet-waardeNULL. - Als de volgende rij een
NULLbevat metLEAD, dan gebruikt de huidige rij de volgende beschikbare niet-waardeNULL.
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. Gebruik RESPECT NULLS om waarden te behouden NULL
De volgende voorbeeldquery demonstreert het gebruik van het RESPECT NULLS argument, wat het standaardgedrag is als het niet is gespecificeerd, in tegenstelling tot het IGNORE NULLS argument in het vorige voorbeeld.
- Als de voorgaande rij bevatte
NULLmetLAG, dan gebruikt de huidige rij de meest recente waarde. - Als de volgende rij een
NULLbevat metLEAD, dan gebruikt de huidige rij de volgende waarde.
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
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
Eén. Vergelijk waarden tussen kwartalen
Het volgende voorbeeld demonstreert de LEAD functie. De zoekopdracht verkrijgt het verschil in verkoopquotawaarden voor een gespecificeerde werknemer over volgende kalenderkwartalen. Omdat er na de laatste rij geen leadwaarde beschikbaar is, wordt de standaard nul (0) gebruikt.
-- 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;
Hier is het resultatenoverzicht.
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