Aracılığıyla paylaş


LAST_VALUE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW) Azure SQL Edge SQL analytics endpoint in Microsoft FabricWarehouse SQL databasein Microsoft Fabric

Sıralı bir değer kümesindeki son değeri döndürür.

Transact-SQL söz dizimi kuralları

Sözdizimi

LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

Bağımsız değişken

scalar_expression

Döndürülecek değer. scalar_expression tek bir değerle sonuçlanacak bir sütun, alt sorgu veya başka bir ifade olabilir. Diğer analiz işlevlerine izin verilmez.

[ 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

IGNORE NULLS - Bir bölüm üzerinde son değeri hesaplarken veri kümesindeki null değerleri yoksayın.

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

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 [ rows_range_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şlev uygulanmadan önce verilerin sırasını belirler. order_by_clause gereklidir.

rows_range_clause, başlangıç ve bitiş noktalarını belirterek bölüm içindeki satırları daha da sınırlar.

Daha fazla bilgi için bkz. OVER Yan Tümcesi (Transact-SQL).

Dönüş türleri

scalar_expressionile aynı tür.

Açıklamalar

LAST_VALUE belirsiz değildir. Daha fazla bilgi için bkz. Deterministic ve nondeterministic functions.

Örnekler

A. Bölümler üzerinde LAST_VALUE kullanma

Aşağıdaki örnek, verilen maaş (Rate) için her departmandaki son çalışanın işe alma tarihini döndürür. PARTITION BY yan tümcesi çalışanları departmana göre bölümler ve LAST_VALUE işlevi her bölüme bağımsız olarak uygulanır. ORDER BY yan tümcesinde belirtilen OVER yan tümcesi, LAST_VALUE işlevinin her bölümdeki satırlara uygulandığı mantıksal sırayı belirler.

USE AdventureWorks2022;
GO

SELECT Department,
    LastName,
    Rate,
    HireDate,
    LAST_VALUE(HireDate) OVER (
        PARTITION BY Department ORDER BY Rate
    ) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph
    ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services', N'Document Control');

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

Department                  LastName                Rate         HireDate     LastValue
--------------------------- ----------------------- ------------ ----------   ----------
Document Control            Chai                    10.25        2003-02-23   2003-03-13
Document Control            Berge                   10.25        2003-03-13   2003-03-13
Document Control            Norred                  16.8269      2003-04-07   2003-01-17
Document Control            Kharatishvili           16.8269      2003-01-17   2003-01-17
Document Control            Arifin                  17.7885      2003-02-05   2003-02-05
Information Services        Berg                    27.4038      2003-03-20   2003-01-24
Information Services        Meyyappan               27.4038      2003-03-07   2003-01-24
Information Services        Bacon                   27.4038      2003-02-12   2003-01-24
Information Services        Bueno                   27.4038      2003-01-24   2003-01-24
Information Services        Sharma                  32.4519      2003-01-05   2003-03-27
Information Services        Connelly                32.4519      2003-03-27   2003-03-27
Information Services        Ajenstat                38.4615      2003-02-18   2003-02-23
Information Services        Wilson                  38.4615      2003-02-23   2003-02-23
Information Services        Conroy                  39.6635      2003-03-08   2003-03-08
Information Services        Trenary                 50.4808      2003-01-12   2003-01-12

B. hesaplanan ifadede FIRST_VALUE ve LAST_VALUE kullanma

Aşağıdaki örnek, hesaplanan ifadelerdeki FIRST_VALUE ve LAST_VALUE işlevlerini kullanarak, belirli bir çalışan sayısı için sırasıyla geçerli üç aylık dönemin satış kotası değeri ile yılın ilk ve son çeyreği arasındaki farkı gösterir. FIRST_VALUE işlevi, yılın ilk çeyreği için satış kotası değerini döndürür ve geçerli üç aylık dönemin satış kotası değerinden çıkarır. DifferenceFromFirstQuarteradlı türetilmiş sütunu döndürür. Yılın ilk çeyreğinde DifferenceFromFirstQuarter sütununun değeri 0'dır. LAST_VALUE işlevi, yılın son çeyreğine ait satış kotası değerini döndürür ve geçerli çeyrek için satış kotası değerinden çıkarır. DifferenceFromLastQuarteradlı türetilmiş sütunda döndürür. Yılın son çeyreğinde DifferenceFromLastQuarter sütununun değeri 0'dır.

RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING sütununda döndürülecek sıfır olmayan değerler için bu örnekte DifferenceFromLastQuarter yan tümcesi gereklidir. Varsayılan aralık RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Bu örnekte, bu varsayılan aralığın kullanılması (veya bir aralık dahil edilmemesi, varsayılanın kullanılmasıyla sonuçlanması) DifferenceFromLastQuarter sütununda sıfırların döndürülmesiyle sonuçlanır. Daha fazla bilgi için bkz. OVER Yan Tümcesi (Transact-SQL).

USE AdventureWorks2022;
GO

SELECT BusinessEntityID,
    DATEPART(QUARTER, QuotaDate) AS Quarter,
    YEAR(QuotaDate) AS SalesYear,
    SalesQuota AS QuotaThisQuarter,
    SalesQuota - FIRST_VALUE(SalesQuota) OVER (
        PARTITION BY BusinessEntityID,
        YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate)
        ) AS DifferenceFromFirstQuarter,
    SalesQuota - LAST_VALUE(SalesQuota) OVER (
        PARTITION BY BusinessEntityID,
        YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate) RANGE BETWEEN CURRENT ROW
                AND UNBOUNDED FOLLOWING
    ) AS DifferenceFromLastQuarter
FROM Sales.SalesPersonQuotaHistory
WHERE YEAR(QuotaDate) > 2005
    AND BusinessEntityID BETWEEN 274
        AND 275
ORDER BY BusinessEntityID,
    SalesYear,
    Quarter;

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

BusinessEntityID Quarter     SalesYear   QuotaThisQuarter      DifferenceFromFirstQuarter DifferenceFromLastQuarter
---------------- ----------- ----------- --------------------- --------------------------- -----------------------
274              1           2006        91000.00              0.00                        -63000.00
274              2           2006        140000.00             49000.00                    -14000.00
274              3           2006        70000.00              -21000.00                   -84000.00
274              4           2006        154000.00             63000.00                    0.00
274              1           2007        107000.00             0.00                        -9000.00
274              2           2007        58000.00              -49000.00                   -58000.00
274              3           2007        263000.00             156000.00                   147000.00
274              4           2007        116000.00             9000.00                     0.00
274              1           2008        84000.00              0.00                        -103000.00
274              2           2008        187000.00             103000.00                   0.00
275              1           2006        502000.00             0.00                        -822000.00
275              2           2006        550000.00             48000.00                    -774000.00
275              3           2006        1429000.00            927000.00                   105000.00
275              4           2006        1324000.00            822000.00                   0.00
275              1           2007        729000.00             0.00                        -489000.00
275              2           2007        1194000.00            465000.00                   -24000.00
275              3           2007        1575000.00            846000.00                   357000.00
275              4           2007        1218000.00            489000.00                   0.00
275              1           2008        849000.00             0.00                        -20000.00
275              2           2008        869000.00             20000.00                    0.00