FIRST_VALUE, LAST_VALUE, dan Tepi Frame
Ambil nilai batas dan pahami jebakan frame LAST_VALUE.
FIRST_VALUE, LAST_VALUE, dan Tepi Frame adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Mengambil Nilai Batas
Pewawancara bertanya: "Tampilkan setiap baris bersama nilai pertama dan terakhir dalam grupnya." Bayangkan tanggal login pertama per pengguna, atau harga terbaru dalam sebuah partisi di samping setiap baris detail.
Fungsinya adalah FIRST_VALUE dan LAST_VALUE. Keduanya tampak sederhana, tetapi LAST_VALUE menyembunyikan salah satu jebakan bingkai jendela paling terkenal dalam SQL. Pelajaran ini membuat keduanya andal.
Dasar FIRST_VALUE
FIRST_VALUE(col) mengembalikan nilai col dari baris pertama jendela dan menyertakannya pada setiap baris. Jika diurutkan berdasarkan tanggal, fungsi ini memberikan nilai paling awal dalam partisinya kepada setiap baris.
Karena bingkai bawaan dimulai pada baris pertama partisi, FIRST_VALUE biasanya berperilaku tepat seperti yang diharapkan.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS first_login
FROM logins;Bingkai Jendela Bawaan
Inilah intinya. Saat Anda menambahkan ORDER BY ke jendela, bingkai bawaannya adalah RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Artinya, jendela untuk setiap baris hanya membentang dari awal partisi sampai baris saat ini, bukan sampai akhir. FIRST_VALUE tidak terpengaruh (baris pertama selalu berada dalam jangkauan), tetapi LAST_VALUE sangat terpengaruh.
Jebakan LAST_VALUE
Jalankan LAST_VALUE hanya dengan ORDER BY, dan sebagian besar kandidat mengira hasilnya adalah nilai terakhir partisi. Namun, karena bingkai berakhir pada baris saat ini, "nilai terakhir dalam bingkai" hanyalah nilai pada baris itu sendiri.
Jadi, kueri ini mengembalikan login_date itu sendiri pada setiap baris, sehingga tampak bermasalah. Inilah jebakan fungsi jendela yang paling sering ditanyakan.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS wrong_last_login
FROM logins;Memperbaiki LAST_VALUE dengan Bingkai Lengkap
Solusinya adalah memperlebar bingkai agar mencakup seluruh partisi: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
Sekarang, jendela untuk setiap baris mencakup seluruh partisi, sehingga LAST_VALUE mengembalikan nilai terakhir yang sebenarnya. Nyatakan perbaikan ini secara eksplisit dalam wawancara; hal ini membuktikan bahwa Anda memahami bingkai, bukan sekadar nama fungsi.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS last_login
FROM logins;Alternatif yang Lebih Mudah
Banyak teknisi menghindari bingkai sepenuhnya: untuk mendapatkan nilai terakhir, gunakan FIRST_VALUE dengan urutan yang dibalik.
FIRST_VALUE(login_date) OVER (... ORDER BY login_date DESC) mengembalikan tanggal terbaru tanpa memerlukan klausa bingkai. Ini adalah trik yang rapi dan mudah diingat untuk disebutkan.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date DESC
) AS last_login
FROM logins;ROWS dan RANGE dalam Bingkai
Bingkai memiliki dua jenis. ROWS menghitung baris fisik; RANGE mengelompokkan berdasarkan nilai ORDER BY yang sama (baris setara).
Bingkai bawaan menggunakan RANGE, sehingga nilai ORDER BY yang sama berbagi batas bingkai. Untuk memperbaiki LAST_VALUE, utamakan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING secara eksplisit agar terhindar dari kejutan akibat nilai yang sama.
NTH_VALUE untuk Posisi Apa Pun
Selain posisi pertama dan terakhir, NTH_VALUE(col, n) mengambil nilai pada posisi n dalam bingkai, misalnya harga tertinggi kedua.
Fungsi ini mengikuti aturan bingkai yang sama seperti LAST_VALUE, jadi gunakan bingkai lengkap jika Anda menginginkan nilai ke-n di seluruh partisi, bukan hanya hingga baris saat ini.
SELECT
product_id,
price,
NTH_VALUE(price, 2) OVER (
PARTITION BY product_id
ORDER BY price DESC
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS second_highest_price
FROM prices;Contoh Terapan: Pertama dan Terakhir Bersamaan
Laporan umum menampilkan setiap transaksi di samping jumlah transaksi pertama dan terakhir pelanggan. Gabungkan kedua fungsi tersebut, dengan mengingat bingkai eksplisit untuk LAST_VALUE.
Sekarang setiap baris memuat nilai pertama dan terakhir dari seluruh partisi, siap digunakan untuk menghitung selisih atau melakukan langkah pemberian label.
SELECT
customer_id,
txn_date,
amount,
FIRST_VALUE(amount) OVER w AS first_amt,
LAST_VALUE(amount) OVER w AS last_amt
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Jendela Bernama Menjaga DRY
Perhatikan bahwa kueri sebelumnya menggunakan klausa WINDOW w AS (...) dan merujuk ke OVER w dua kali. Mendefinisikan jendela satu kali menghindari pengulangan spesifikasi bingkai yang panjang dan mencegah kedua fungsi tersebut tidak lagi selaras.
Sebagian besar basis data utama mendukung jendela bernama. Menggunakannya merupakan sentuhan rapi yang diapresiasi pewawancara ketika beberapa kolom berbagi satu jendela.
Contoh Terapan: Selisih dari Pertama ke Terakhir
Pertanyaan lanjutan yang sering muncul adalah perubahan dari transaksi pertama ke transaksi terakhir pelanggan. Dengan kedua nilai batas di setiap baris, kurangkan keduanya, lalu sisakan satu baris per pelanggan jika diperlukan.
Ini menggabungkan perbaikan bingkai lengkap dengan aritmetika sederhana, jenis jawaban menyeluruh yang ingin dilihat pewawancara dirangkai dengan rapi.
SELECT DISTINCT
customer_id,
LAST_VALUE(amount) OVER w - FIRST_VALUE(amount) OVER w AS first_to_last_delta
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Pemeriksaan Singkat
Jebakan klasik LAST_VALUE.
Ringkasan
Fungsi nilai batas bergantung pada bingkai:
FIRST_VALUEberfungsi dengan bingkai bawaan;LAST_VALUEtidak.- Bingkai bawaan berakhir pada baris saat ini, jadi perbaiki
LAST_VALUEdenganROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, atau balik urutannya dan gunakanFIRST_VALUE. NTH_VALUE(col, n)mengambil posisi apa pun; jendela bernama menjaga DRY untuk spesifikasi banyak kolom.
Dengan ini, perangkat fungsi LAG, LEAD, NTILE, dan nilai batas Anda lengkap.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “FIRST_VALUE, LAST_VALUE, dan Tepi Frame” gratis?
Ya — teks lengkap “FIRST_VALUE, LAST_VALUE, dan Tepi Frame” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “FIRST_VALUE, LAST_VALUE, dan Tepi Frame”?
Ambil nilai batas dan pahami jebakan frame LAST_VALUE. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “FIRST_VALUE, LAST_VALUE, dan Tepi Frame” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- LAG dan LEAD untuk Baris Berdekatan
- Perubahan Antar-Periode
- NTILE untuk Pengelompokan Rentang
- FIRST_VALUE, LAST_VALUE, dan Tepi Frame