Mempertahankan Baris Terbaru Per Kunci
Pola “rekaman terbaru per pelanggan” dengan partition by kunci dan order by tanggal.
Mempertahankan Baris Terbaru Per Kunci 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.
Pertanyaan tentang Baris Terbaru per Kunci
"Kembalikan pesanan terbaru untuk setiap pelanggan." "Dapatkan status terbaru untuk setiap perangkat." Masalah baris-terbaru-per-kunci ini adalah salah satu tugas wawancara SQL yang paling sering muncul karena terus ditemukan dalam pekerjaan analitik nyata.
Ini merupakan kasus khusus pengambilan satu baris teratas per kelompok: partisi berdasarkan kunci, urutkan berdasarkan stempel waktu secara menurun, lalu pertahankan baris pertama. Pelajaran ini membahas pola tersebut secara mendalam beserta alternatifnya.
Mengapa MAX Saja Tidak Cukup
Jawaban pertama yang menggoda adalah MAX(order_date) yang dikelompokkan berdasarkan pelanggan. Hasilnya adalah tanggal terbaru, tetapi bukan sisa baris pesanan tersebut, seperti id pesanan, jumlah, atau status.
Jika pewawancara menginginkan seluruh baris terbaru, MAX dengan GROUP BY memerlukan penggabungan tambahan kembali ke tabel berdasarkan kunci dan tanggal maksimum, yang lebih panjang dan dapat gagal saat terjadi nilai seri. Fungsi jendela lebih rapi.
-- Gives the date, not the full row
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;Pola ROW_NUMBER
Partisikan berdasarkan kunci, urutkan berdasarkan stempel waktu secara menurun, dan baris terbaru akan mendapatkan rn = 1. Pertahankan hanya baris tersebut untuk memperoleh seluruh catatan terbaru bagi setiap kunci.
Ini adalah jawaban utama. Hasilnya tepat satu baris per kunci, bahkan ketika stempel waktunya sama, yang biasanya dimaksud dengan "baris terbaru".
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC
) AS rn
FROM orders
)
SELECT customer_id, order_id, order_date, amount
FROM ranked
WHERE rn = 1;Memecahkan Nilai Seri pada Stempel Waktu
Dua pesanan untuk pelanggan yang sama dapat memiliki order_date yang sama (pada hari yang sama atau dengan stempel waktu yang identik). Tanpa penentu seri, baris mana yang menjadi rn = 1 ditentukan secara sembarang dan dapat berubah antarpengoperasian.
Tambahkan kunci sekunder yang unik, seperti order_id DESC, agar baris terbaru ditentukan secara konsisten. Pewawancara secara khusus menguji apakah Anda menyadari kasus tepi ini.
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, order_id DESC
) AS rnTerbaru atau Semua Nilai Seri
Tentukan arti "terbaru" ketika stempel waktu sama:
- Jika Anda menginginkan tepat satu baris per kunci → gunakan
ROW_NUMBERdengan penentu seri. - Jika Anda menginginkan semua baris yang memiliki stempel waktu maksimum → gunakan
RANK() = 1, yang mengembalikan setiap baris terbaru yang seri.
Mengajukan pertanyaan klarifikasi ini menunjukkan bahwa Anda memahami maknanya, bukan hanya sintaksnya.
WITH ranked AS (
SELECT *,
RANK() OVER (
PARTITION BY customer_id ORDER BY order_date DESC
) AS rnk
FROM orders
)
SELECT * FROM ranked WHERE rnk = 1;Alternatif Subkueri Berkorelasi
Sebelum fungsi jendela digunakan secara luas, jawaban untuk baris terbaru per kunci menggunakan subkueri berkorelasi: pertahankan sebuah baris hanya jika tidak ada baris lain untuk kunci yang sama dengan tanggal yang lebih besar.
Pendekatan ini berfungsi, tetapi menjalankan kueri bagian dalam untuk setiap baris, sehingga lebih lambat pada tabel besar dan kurang praktis ketika terjadi nilai seri. Sebutkan pendekatan ini untuk menunjukkan penguasaan berbagai metode, tetapi utamakan jawaban dengan fungsi jendela demi kinerja.
SELECT o.*
FROM orders o
WHERE o.order_date = (
SELECT MAX(o2.order_date)
FROM orders o2
WHERE o2.customer_id = o.customer_id
);Pintasan DISTINCT ON PostgreSQL
PostgreSQL menyediakan idiom ringkas: DISTINCT ON (key) mempertahankan baris pertama untuk setiap kunci berdasarkan ORDER BY. ORDER BY harus diawali kolom kunci yang sama, kemudian penentu seri atau stempel waktu.
Pendekatan ini elegan dan cepat di PostgreSQL, tetapi tidak portabel. Sebutkan sebagai bonus khusus dialek, sementara tetap menjadikan ROW_NUMBER pilihan portabel bawaan Anda.
SELECT DISTINCT ON (customer_id)
customer_id, order_id, order_date, amount
FROM orders
ORDER BY customer_id, order_date DESC, order_id DESC;Baris Terbaru dengan Kondisi
Pertanyaan nyata menambahkan filter: "pesanan yang telah selesai terbaru untuk setiap pelanggan". Terapkan filter sebelum pemeringkatan agar hanya baris yang memenuhi syarat yang diberi nomor.
Letakkan kondisi dalam WHERE pada kueri bagian dalam (kondisi ini dijalankan sebelum fungsi jendela), lalu ambil rn = 1 dalam kueri luar. Memfilter setelah pemeringkatan akan menghasilkan baris yang salah.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date DESC, order_id DESC
) AS rn
FROM orders
WHERE status = 'completed'
)
SELECT * FROM ranked WHERE rn = 1;Contoh Lengkap: Status Perangkat Terbaru
Tabel status_log mencatat device_id, status, dan logged_at. Untuk mendapatkan status terkini setiap perangkat, partisi berdasarkan device_id, urutkan berdasarkan logged_at DESC, lalu pertahankan rn = 1.
Inilah dasar dasbor yang menampilkan "keadaan saat ini" dari banyak entitas berdasarkan log peristiwa yang hanya dapat ditambahi. Resep yang sama mendukung kueri harga terbaru, lokasi terbaru, dan versi terbaru.
WITH latest AS (
SELECT device_id, status, logged_at,
ROW_NUMBER() OVER (
PARTITION BY device_id ORDER BY logged_at DESC
) AS rn
FROM status_log
)
SELECT device_id, status, logged_at
FROM latest
WHERE rn = 1;Catatan Kinerja
Poin pembahasan yang menunjukkan tingkat senior:
- Indeks pada
(customer_id, order_date DESC)memungkinkan mesin membaca baris terbaru untuk setiap kunci secara efisien. - Pendekatan dengan fungsi jendela memindai tabel satu kali; subkueri berkorelasi tidak demikian.
DISTINCT ONdi PostgreSQL dapat menggunakan indeks yang sama dan sering menjadi pilihan tercepat untuk satu tabel.- Untuk log peristiwa yang sering ditambahi, pertimbangkan tabel terwujud "terbaru" yang diperbarui secara bertahap.
Kesalahan Umum
Perhatikan hal-hal berikut:
- Menggunakan
MAX(date)dan hanya mengembalikan tanggal, bukan seluruh baris. - Lupa menambahkan penentu seri, sehingga hasilnya tidak deterministik ketika tanggal sama.
- Memfilter berdasarkan kondisi setelah pemeringkatan, sehingga dapat memilih baris yang seharusnya dikecualikan.
- Menyamakan "satu baris terbaru" (
ROW_NUMBER) dengan "semua baris terbaru yang seri" (RANK).
Pemeriksaan Singkat
Pilih kueri baris-terbaru-per-kunci yang benar.
Meninjau Kembali: Baris Terbaru per Kunci
Polanya: PARTITION BY key, ORDER BY timestamp DESC (ditambah penentu seri yang unik), pertahankan rn = 1.
MAX(date)memberikan tanggal, bukan seluruh baris.- Selalu tambahkan penentu seri agar hasilnya deterministik.
- Gunakan
RANK() = 1jika Anda menginginkan semua baris yang memiliki stempel waktu terbaru yang sama. - Kondisi filter harus berada dalam kueri bagian dalam, sebelum pemeringkatan.
DISTINCT ONPostgreSQL merupakan alternatif khusus dialek yang ringkas dan cepat.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mempertahankan Baris Terbaru Per Kunci” gratis?
Ya — teks lengkap “Mempertahankan Baris Terbaru Per Kunci” 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 “Mempertahankan Baris Terbaru Per Kunci”?
Pola “rekaman terbaru per pelanggan” dengan partition by kunci dan order by tanggal. 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 “Mempertahankan Baris Terbaru Per Kunci” 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
- Baris Top-N Per Grup dengan ROW_NUMBER
- Menangani Nilai Seri dalam Top-N
- Menghapus Duplikat Baris dengan Aman
- Mempertahankan Baris Terbaru Per Kunci