Aracılığıyla paylaş


LEAD (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

SQL Server 2012 (11.x) ile başlayan self-join kullanmadan aynı sonuç kümesindeki sonraki satırdan veriye erişir. LEAD mevcut satırı takip eden belirli bir fiziksel ofsette bir satıra erişim sağlar. Bu analitik fonksiyonu bir ifadede SELECT kullanarak mevcut satırdaki değerleri sonraki satırdaki değerlerle karşılaştırın.

Transact-SQL söz dizimi kuralları

Sözdizimi

LEAD ( scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause )

Arguments

scalar_expression

Belirtilen ofsete göre iade edilecek değer. Bu, tek bir (skaler) değer döndüren herhangi bir tür ifadedir. scalar_expression analitik bir fonksiyon olamaz.

ofset

Mevcut satırdan ileriye doğru bir değer elde edilecek satır sayısı. Belirtilmezse, varsayılan değer 1'dir. Ofset , pozitif tam sayıya değerlenen veya örtük olarak bigint'e dönüştürülebilecek bir sütun, alt sorgu veya başka bir ifade olabilir. Ofset negatif bir değer veya analitik fonksiyon olamaz.

varsayılan

Kaydırıldığında döndürülecek değer bölümün kapsamının dışındadır. Varsayılan değer belirtilmemişse, NULL geri döner. varsayılan bir sütun, alt sorgu veya başka bir ifade olabilir, ancak analitik bir fonksiyon olamaz. varsayılanolarak scalar_expression ile tip uyumlu olmalıdır.

[ NULL'LARı YOKSAY | RESPECT NULLS ]

Uygulanır: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Database, Azure SQL Managed Instance, Azure SQL Edge

IGNORE NULLS - Bir bölüm üzerinden ilk değeri hesaplarken veri setindeki değerleri görmezden NULL gelin.

RESPECT NULLS - Bir bölüm üzerinden ilk değeri hesaplarken veri setindeki değerlere saygı NULL gösterin. RESPECT NULLS bir NULLS seçenek belirtilmemişse varsayılan davranıştır.

SQL Server 2022 CU4'te ve IGNORE NULLSLAGile ilgili LEAD bir hata düzeltildi.

Azure SQL Edge'de bu bağımsız değişken hakkında daha fazla bilgi için bkz. Eksik değerleri.

OVER ( [ partition_by_clause ] order_by_clause )

  • partition_by_clause yan tümcesi tarafından FROM üretilen sonuç kümesini işlevin uygulandığı bölümlere böler. Belirtilmezse, işlev sorgu sonuç kümesinin tüm satırlarını tek bir grup olarak ele alır.

  • order_by_clause , fonksiyon uygulanmadan önceki verilerin sırasını belirler.

partition_by_clause belirtildiğinde, her bölümdeki verilerin sırasını belirler. order_by_clause zorunludur. Daha fazla bilgi için bkz. SELECT - OVER Maddesi.

Dönüş türleri

Belirtilen scalar_expression veri türü. NULL scalar_expression nullable olursa veya varsayılan olarak NULLayarlanmışsa döner.

LEAD belirsiz değildir. Daha fazla bilgi için bkz . Deterministic ve Nondeterministic Functions.

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Yıllar arasındaki değerleri karşılaştırın

Sorgu, belirli bir çalışanın sonraki yıllardaki satış kotalarındaki farkı döndürmek için LEAD bu fonksiyonu kullanır. Son satır için potansiyel müşteri değeri olmadığı için, varsayılan sıfır (0) döner.

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');

Sonuç kümesi aşağıdadır.

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. Bölümler içindeki değerleri karşılaştırın

Aşağıdaki örnek, çalışanlar arasındaki yılbaşından bu kadar satışları karşılaştırmak için bu fonksiyonu kullanır LEAD . Bu madde, PARTITION BY satış bölgesine göre sonuç kümesinde satırları bölmek için belirlenmiştir. Fonksiyon LEAD her bölüme ayrı ayrı uygulanır ve hesaplama her bölüm için yeniden başlar. Şartta ORDER BY belirtilen cümleOVER, fonksiyon uygulanmadan önce her bölümdeki satır sırasını düzenler. Cümledeki ORDER BY cümleSELECT, tüm sonuç kümesindeki satırları sıralar. Her bölümün son satırında potansiyel müşteri değeri olmadığından, varsayılan sıfır (0) döner.

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;

Sonuç kümesi aşağıdadır.

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. Rastgele ifadeler belirtin

Aşağıdaki örnek, fonksiyon sözdiziminde NULL çeşitli rastgele ifadelerin belirtilmesini ve değerlerin LEAD göz ardı edilmesini gösterir.

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;

Sonuç kümesi aşağıdadır.

b           c           i
----------- ----------- -----------
1           5           -2
2           NULL        NULL
3           1           0
1           NULL        2
2           4           2
1           -3          8

D. NULL olmayan değerleri bulmak için NULLS'u IGNORE kullanın

Aşağıdaki numune sorgu, argümanın IGNORE NULLS kullanıldığını gösterir.

Argüman, IGNORE NULLS hem LAG ile hem de LEAD önceki veya sonraki NULL olmayan değerlerin yerine değerlerin yer NULL değiştirmesini göstermek için kullanılır.

  • Eğer önceki satır ile NULLbirlikteyseLAG, mevcut satır en güncel olmayanNULL değeri kullanır.
  • Eğer sonraki satırda bir ile NULLbir LEAD varsa, mevcut satır bir sonraki mevcut olmayanNULL değeri kullanır.
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. Değerleri korumak NULL için RESPECT NULLS kullanın

Aşağıdaki örnek sorgu, önceki örnekteki argümanın aksine, belirtilmemişse RESPECT NULLS varsayılan davranış olan argümanı IGNORE NULLS kullanmayı gösterir.

  • Eğer önceki satır ile NULLbirlikteyseLAG, mevcut satır en güncel değeri kullanır.
  • Eğer bir sonraki satırda bir NULL ile LEADbir varsa, mevcut satır da bir sonraki değeri kullanır.
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

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

A. Çeyrekler arasında değerleri karşılaştırın

Aşağıdaki örnek fonksiyonu LEAD göstermektedir. Sorgu, belirli bir çalışan için sonraki takvim çeyreklerinde satış kotası değerlerindeki farkı elde eder. Son satırdan sonra potansiyel müşteri değeri olmadığı için, varsayılan sıfır (0) kullanılır.

-- 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;

Sonuç kümesi aşağıdadır.

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