Delen via


LEAD (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-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 FROM component 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 NULL met LAG, dan gebruikt de huidige rij de meest recente niet-waardeNULL .
  • Als de volgende rij een NULL bevat met LEAD, 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 NULL met LAG, dan gebruikt de huidige rij de meest recente waarde.
  • Als de volgende rij een NULL bevat met LEAD, 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