LAST_VALUE (Transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform System (PDW) YesAzure SQL Edge

Mengembalikan nilai terakhir dalam sekumpulan nilai yang diurutkan.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

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

Catatan

Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

scalar_expression

Adalah nilai yang akan dikembalikan. scalar_expression bisa berupa kolom, subkueri, atau ekspresi lain yang menghasilkan satu nilai. Fungsi analitik lainnya tidak diizinkan.

[ ABAIKAN NULLS | HORMATI NULLS ]

Berlaku untuk: SQL Server (dimulai dengan Pratinjau SQL Server 2022 (16.x), Azure SQL Edge

IGNORE NULLS - Abaikan nilai null dalam himpunan data saat menghitung nilai terakhir melalui partisi.

RESPECT NULLS - Menghormati nilai null dalam himpunan data saat menghitung nilai terakhir melalui partisi.

Untuk informasi selengkapnya, lihat Mengintegrasikan nilai yang hilang.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause membagi tataan hasil yang dihasilkan oleh klausa FROM menjadi partisi tempat fungsi diterapkan. Jika tidak ditentukan, fungsi memperlakukan semua baris hasil kueri yang ditetapkan sebagai grup tunggal.

order_by_clause menentukan urutan data sebelum fungsi diterapkan. Order_by_clause diperlukan.

rows_range_clause selanjutnya membatasi baris dalam partisi dengan menentukan titik awal dan akhir.

Untuk informasi selengkapnya, lihat Klausa OVER (Transact-SQL).

Tipe yang dikembalikan

Jenis yang sama dengan scalar_expression.

Keterangan

LAST_VALUE bersifat nondeterministik. Untuk informasi selengkapnya, lihat Fungsi Deterministik dan Nondeterministik.

Contoh

A. Menggunakan LAST_VALUE di atas partisi

Contoh berikut mengembalikan tanggal sewa karyawan terakhir di setiap departemen untuk gaji yang diberikan (Rate). Klausa mempartisi PARTITION BY karyawan berdasarkan departemen dan LAST_VALUE fungsi diterapkan pada setiap partisi secara independen. Klausa ORDER BY yang ditentukan dalam OVER klausul menentukan urutan logis di mana LAST_VALUE fungsi diterapkan ke baris di setiap partisi.

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

Berikut set hasilnya.

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. Menggunakan FIRST_VALUE dan LAST_VALUE dalam ekspresi komputasi

Contoh berikut menggunakan FIRST_VALUE fungsi dan LAST_VALUE dalam ekspresi komputasi untuk menunjukkan perbedaan antara nilai kuota penjualan untuk kuartal saat ini dan kuartal pertama dan terakhir tahun ini masing-masing untuk sejumlah karyawan tertentu. Fungsi mengembalikan FIRST_VALUE nilai kuota penjualan untuk kuartal pertama tahun ini, dan menguranginya dari nilai kuota penjualan untuk kuartal saat ini. Ini dikembalikan dalam kolom turunan yang berjudul DifferenceFromFirstQuarter. Untuk kuartal pertama setahun, nilai DifferenceFromFirstQuarter kolom adalah 0. Fungsi mengembalikan LAST_VALUE nilai kuota penjualan untuk kuartal terakhir tahun ini, dan menguranginya dari nilai kuota penjualan untuk kuartal saat ini. Ini dikembalikan dalam kolom turunan yang berjudul DifferenceFromLastQuarter. Untuk seperempat tahun terakhir, nilai DifferenceFromLastQuarter kolom adalah 0.

Klausa RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING diperlukan dalam contoh ini agar nilai bukan nol dikembalikan dalam kolom, seperti yang DifferenceFromLastQuarter ditunjukkan di bawah ini. Rentang defaultnya adalah RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Dalam contoh ini, menggunakan rentang default tersebut (atau tidak termasuk rentang, yang mengakibatkan default digunakan) akan mengakibatkan nol dikembalikan di DifferenceFromLastQuarter kolom. Untuk informasi selengkapnya, lihat Klausa OVER (Transact-SQL).

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

Berikut set hasilnya.

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

Lihat juga