Aracılığıyla paylaş


LAG (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 bir kendi kendine birleştirme kullanmadan aynı sonuç kümesindeki önceki bir satırdaki verilere erişir. LAG, geçerli satırdan önce gelen belirli bir fiziksel uzaklıkta bir satıra erişim sağlar. Geçerli satırdaki değerleri önceki satırdaki değerlerle karşılaştırmak için select deyiminde bu analitik işlevi kullanın.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Bağımsız değişken

scalar_expression

Belirtilen uzaklık temelinde döndürülecek değer. Tek bir (skaler) değer döndüren herhangi bir türde bir ifadedir. scalar_expression analiz işlevi olamaz.

uzaklık
Bir değerin alındığı geçerli satırdan geri alınan satır sayısı. Belirtilmezse, varsayılan değer 1'dir. uzaklık pozitif bir tamsayı olarak değerlendirilen veya örtük olarak bigintdönüştürülebilen bir sütun, alt sorgu veya başka bir ifade olabilir. uzaklık negatif bir değer veya analitik işlev olamaz.

Varsayılan
uzaklık bölümün kapsamı dışında olduğunda döndürülecek değer. Varsayılan değer belirtilmezse NULL döndürülür. varsayılan bir sütun, alt sorgu veya başka bir ifade olabilir, ancak analiz işlevi olamaz. varsayılanscalar_expressionile tür uyumlu olmalıdır.

[ NULL'LARı YOKSAY | RESPECT NULLS ]

için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Azure SQL Edge

NULLS YOKSAY - Bir bölüm üzerindeki ilk değeri hesaplarken veri kümesindeki null değerleri yoksayın.

RESPECT NULLS - Bir bölüm üzerinde ilk değer hesaplanırken veri kümesindeki null değerleri dikkate alır. RESPECT NULLS, NULLS seçeneği belirtilmezse varsayılan davranıştır.

SQL Server 2022 CU4 ve NULLS'leri YOKSAY ile ilgili bir hata düzeltmesi yapıldı.

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 FROM yan tümcesi tarafından ü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 işlevi uygulanmadan önce verilerin sırasını belirler. partition_by_clause belirtilirse, bölümdeki verilerin sırasını belirler. order_by_clause gereklidir. Daha fazla bilgi için bkz. OVER Yan Tümcesi (Transact-SQL).

Dönüş Türleri

Belirtilen scalar_expressionveri türü. scalar_expression null atanabilirse veya varsayılan NULL olarak ayarlandıysa NULL döndürülür.

Genel Açıklamalar

LAG belirleyici değildir. Daha fazla bilgi için bkz. Deterministic ve Nondeterministic Functions.

Örnekler

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

Aşağıdaki örnek, önceki yıllara göre belirli bir çalışanın satış kotalarındaki farkı döndürmek için LAG işlevini kullanır. İlk satır için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.

USE AdventureWorks2022;  
GO  
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,   
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota  
FROM Sales.SalesPersonQuotaHistory  
WHERE BusinessEntityID = 275 AND YEAR(QuotaDate) IN ('2005','2006');  

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

BusinessEntityID SalesYear   CurrentQuota          PreviousQuota  
---------------- ----------- --------------------- ---------------------  
275              2005        367000.00             0.00  
275              2005        556000.00             367000.00  
275              2006        502000.00             556000.00  
275              2006        550000.00             502000.00  
275              2006        1429000.00            550000.00  
275              2006        1324000.00            1429000.00  
  

B. Bölümler içindeki değerleri karşılaştırma

Aşağıdaki örnek, çalışanlar arasındaki yıllık satışları karşılaştırmak için LAG işlevini kullanır. PARTITION BY yan tümcesi, sonuç kümesindeki satırları satış bölgesine bölmek için belirtilir. LAG işlevi her bölüme ayrı ayrı uygulanır ve her bölüm için hesaplama yeniden başlatılır. OVER yan tümcesindeki ORDER BY yan tümcesi, her bölümdeki satırları sıralar. SELECT deyimindeki ORDER BY yan tümcesi, sonuç kümesinin tamamında satırları sıralar. Her bölümün ilk satırı için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.

USE AdventureWorks2022;  
GO  
SELECT TerritoryName, BusinessEntityID, SalesYTD,   
       LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales  
FROM Sales.vSalesPerson  
WHERE TerritoryName IN (N'Northwest', N'Canada')   
ORDER BY TerritoryName;  

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

TerritoryName            BusinessEntityID SalesYTD              PrevRepSales  
-----------------------  ---------------- --------------------- ---------------------  
Canada                   282              2604540.7172          0.00  
Canada                   278              1453719.4653          2604540.7172  
Northwest                284              1576562.1966          0.00  
Northwest                283              1573012.9383          1576562.1966  
Northwest                280              1352577.1325          1573012.9383  
  

C. Rastgele ifadeler belirtme

Aşağıdaki örnek, ÇEŞITLI rastgele ifadeler belirtmeyi ve LAG işlevinin söz diziminde NULL değerlerini yoksaymayı 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,   
    LAG(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           -3          1  
2           4           -2  
1           NULL        8  
3           1           -6  
2           NULL        8  
1           5           2  

D. NULL olmayan değerleri bulmak için IGNORE NULLS kullanma

Aşağıdaki örnek sorgu, IGNORE NULLS bağımsız değişkenini kullanmayı gösterir.

IGNORE NULLS bağımsız değişkeni, önceki veya sonraki NULL olmayan değerler için NULL değerlerinin değiştirilmesini göstermek için hem LAG hem de LEAD kullanılır.

  • Önceki satır LAGile NULL içeriyorsa, geçerli satır en son NULL olmayan değeri kullanır.
  • Sonraki satır LEADiçeren bir NULL içeriyorsa, geçerli satır bir sonraki kullanılabilir NULL olmayan 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. NULL değerlerini korumak için RESPECT NULLS kullanma

Aşağıdaki örnek sorgu, önceki örnekteki IGNORE NULLS bağımsız değişkeninin aksine belirtilmezse varsayılan davranış olan RESPECT NULLS bağımsız değişkeninin kullanılmasını gösterir.

  • Önceki satır LAGile NULL içeriyorsa, geçerli satır en son değeri kullanır.
  • Sonraki satır LEADiçeren bir NULL içeriyorsa, geçerli satır 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. Üç aylık dönemler arasındaki değerleri karşılaştırma

Aşağıdaki örnekte LAG işlevi gösterilmektedir. Sorgu, önceki takvim dönemlerine göre belirli bir çalışanın satış kotalarındaki farkı döndürmek için LAG işlevini kullanır. İlk satır için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.

-- Uses AdventureWorks  
  
SELECT CalendarYear, CalendarQuarter, SalesAmountQuota AS SalesQuota,  
       LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS PrevQuota,  
       SalesAmountQuota - LAG(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  PrevQuota  Diff  
---- -------  ----------  ---------  -------------  
2001 3        28000.0000      0.0000   28000.0000  
2001 4         7000.0000  28000.0000  -21000.0000  
2001 1        91000.0000   7000.0000   84000.0000  
2002 2       140000.0000  91000.0000   49000.0000  
2002 3         7000.0000 140000.0000  -70000.0000  
2002 4       154000.0000   7000.0000   84000.0000

Sonraki adımlar