Gaji Tertinggi Kedua, Lima Cara
Bandingkan solusi subkueri, LIMIT/OFFSET, dan fungsi jendela.
Gaji Tertinggi Kedua, Lima Cara adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 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 yang Dihadapi Semua Orang
"Temukan gaji tertinggi kedua" adalah pertanyaan wawancara SQL yang paling sering ditanyakan. Pewawancara menyukainya karena memiliki banyak jawaban yang benar dan beberapa jebakan yang halus.
Anggaplah tersedia tabel employee dengan kolom id dan salary. Tugas Anda adalah mengembalikan nilai gaji berbeda tertinggi kedua.
- Jika gajinya adalah 300, 200, 200, 100, jawabannya adalah 200, bukan baris kedua.
- Jika tidak ada gaji berbeda kedua, jawaban yang biasanya diharapkan adalah
NULL.
Dalam bagian-bagian berikutnya, Anda akan menyelesaikannya dengan lima cara berbeda dan membahas kapan masing-masing cara paling unggul.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Cara 1: MAX atas Nilai di Bawah MAX
Solusi yang paling intuitif: gaji tertinggi kedua adalah gaji terbesar yang lebih kecil secara ketat daripada nilai maksimum keseluruhan.
Solusi ini hampir seperti membaca bahasa biasa dan berfungsi di setiap dialek SQL. Subkueri bagian dalam menemukan nilai teratas, sedangkan MAX bagian luar menemukan nilai terbesar di bawahnya.
Bonus: jika tidak ada gaji berbeda kedua, MAX bagian luar mengagregasi nol baris dan secara otomatis mengembalikan NULL. NULL gratis ini persis seperti yang diinginkan pewawancara.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Mengapa subkueri menangani duplikat
Perhatikan bahwa kita tidak pernah menggunakan DISTINCT di Cara 1, tetapi duplikat tetap ditangani dengan benar.
Jika tiga orang menerima gaji 200 dan orang dengan gaji tertinggi menerima 300, kueri dalam mengembalikan 300. Filter luar mempertahankan setiap baris di bawah 300, dan MAX dari baris-baris tersebut adalah 200, berapa pun jumlah nilai 200 yang ada.
Inilah inti pemahamannya: fungsi agregat menggabungkan duplikat secara otomatis. Banyak kandidat membuat solusi terlalu rumit dengan DISTINCT, padahal fungsi agregat sudah melakukan hal yang tepat.
Cara 2: LIMIT dengan OFFSET
Dalam MySQL dan PostgreSQL, Anda dapat mengurutkan gaji yang berbeda secara menurun lalu melewati yang pertama.
OFFSET 1melewati nilai tertinggi.LIMIT 1hanya menyisakan nilai berikutnya.
DISTINCT sangat penting di sini. Jika tidak, duplikat gaji tertinggi akan membuat OFFSET 1 berhenti pada pengulangan nilai maksimum, bukan pada nilai tertinggi kedua yang sebenarnya.
Jebakan: jika tidak ada nilai berbeda kedua, ini mengembalikan nol baris, bukan NULL. Kita akan memperbaiki kasus batas ini pada pelajaran 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Cara 3: FETCH untuk SQL Server dan Oracle
SQL Server dan Oracle versi modern tidak mendukung LIMIT ... OFFSET. Keduanya menggunakan sintaks standar ANSI OFFSET ... FETCH.
Logikanya identik dengan Cara 2: urutkan gaji yang berbeda secara menurun, lewati satu baris, lalu ambil satu baris. Mengetahui penulisan lintas dialek menunjukkan pengalaman dunia nyata kepada pewawancara.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Cara 4: fungsi jendela DENSE_RANK
Pendekatan modern yang dapat diskalakan menggunakan fungsi jendela. DENSE_RANK memberikan peringkat 1 kepada gaji tertinggi, peringkat 2 kepada gaji berbeda berikutnya, serta memberikan peringkat yang sama kepada gaji yang sama tanpa celah.
Kita menghitung peringkat dalam subkueri, lalu memfilter peringkat 2 dalam kueri luar. Ingat: Anda tidak dapat memfilter fungsi jendela secara langsung di WHERE, sehingga pembungkus subkueri wajib digunakan.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Mengapa DENSE_RANK, bukan RANK atau ROW_NUMBER
Pemilihan fungsi peringkat penting untuk semantik "nilai berbeda":
ROW_NUMBERmemberikan nomor unik kepada setiap baris, sehingga dua orang yang menerima gaji 300 akan menempati baris 1 dan 2, dan peringkat 2 akan menjadi pengulangan gaji tertinggi. Salah.RANKmeninggalkan celah setelah nilai yang sama: dua gaji 300 mendapat peringkat 1, lalu gaji berikutnya langsung mendapat peringkat 3. Anda akan melewatkannya pada peringkat 2. Salah.DENSE_RANKmemberikan peringkat yang sama kepada nilai yang sama tanpa celah, sehingga peringkat 2 selalu merupakan gaji berbeda tertinggi kedua. Benar.
Cara 5: hitungan subkueri berkorelasi
Ini adalah trik klasik sebelum adanya fungsi jendela: suatu gaji merupakan gaji tertinggi ke-N jika tepat ada N-1 gaji berbeda yang secara ketat lebih tinggi daripadanya.
Untuk gaji tertinggi kedua, kita menginginkan tepat satu gaji berbeda di atasnya. Cara ini elegan, tetapi dapat lambat pada tabel besar karena hitungan dalam dijalankan untuk setiap baris luar.
Cara ini juga mudah digeneralisasi ke gaji tertinggi ke-N dengan mengubah hitungannya menjadi N - 1, sehingga pewawancara senang melihatnya.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Contoh lengkap dari awal hingga akhir
Gunakan gaji: 500, 500, 350, 350, 100.
- Cara 1: MAX adalah 500, nilai terbesar di bawah 500 adalah 350. Jawabannya 350.
- Cara 4 (DENSE_RANK): 500 -> peringkat 1, 350 -> peringkat 2, 100 -> peringkat 3. Peringkat 2 adalah 350.
- Cara 5: untuk gaji 350, tepat ada satu gaji berbeda (500) yang lebih tinggi. Cocok. Jawabannya 350.
Kelima metode menghasilkan jawaban yang sama: gaji berbeda tertinggi kedua adalah 350, meskipun terdapat duplikat.
Mana yang sebaiknya Anda pilih
Panduan wawancara:
- Sampaikan pertanyaannya terlebih dahulu: "Apakah Anda menginginkan gaji yang berbeda, dan NULL jika tidak ada?" Mengajukan klarifikasi akan menambah nilai.
- DENSE_RANK adalah jawaban default yang paling kuat; cara ini dapat digeneralisasi ke nilai ke-N dan per kelompok dengan rapi.
- MAX di bawah MAX adalah solusi satu baris terbaik dan mengembalikan NULL secara otomatis.
- LIMIT/OFFSET ringkas, tetapi khusus untuk dialek tertentu dan mengembalikan tanpa baris pada kasus batas.
Menyebutkan kompromi secara lisan adalah hal yang membedakan jawaban tingkat menengah dari jawaban pemula.
Kesalahan umum yang perlu dihindari
Waspadai jebakan berikut yang sengaja dibuat oleh pewawancara:
- Menggunakan
ROW_NUMBERalih-alihDENSE_RANKsehingga gaji tertinggi diperoleh dua kali. - Melupakan
DISTINCTdalam versi LIMIT/OFFSET ketika terdapat beberapa nilai maksimum yang sama. - Menganggap
ORDER BY salary DESC LIMIT 1,1mengembalikan nilai yang berbeda, padahal tidak. - Mengembalikan baris kedua, bukan nilai kedua.
Pemeriksaan Cepat
Uji pemahaman Anda tentang pemilihan fungsi peringkat.
Ringkasan
Sekarang Anda memiliki lima cara untuk menemukan gaji tertinggi kedua:
- MAX di bawah MAX - portabel dan mengembalikan NULL secara otomatis.
- LIMIT/OFFSET dan OFFSET/FETCH - ringkas dan khusus untuk dialek tertentu.
- DENSE_RANK - pilihan default yang dapat diskalakan dan menangani nilai yang sama dengan benar.
- Hitungan berkorelasi - elegan dan dapat digeneralisasi ke nilai ke-N.
Inti pembelajaran: tanyakan apakah Anda memerlukan nilai yang berbeda, utamakan DENSE_RANK untuk menangani nilai yang sama, dan ingat metode mana yang mengembalikan NULL dibandingkan tanpa baris ketika nilai kedua tidak ada.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Gaji Tertinggi Kedua, Lima Cara” gratis?
Ya — teks lengkap “Gaji Tertinggi Kedua, Lima Cara” 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 “Gaji Tertinggi Kedua, Lima Cara”?
Bandingkan solusi subkueri, LIMIT/OFFSET, dan fungsi jendela. 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 1 dari 4.
Berapa lama pelajaran “Gaji Tertinggi Kedua, Lima Cara” 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
- Gaji Tertinggi Kedua, Lima Cara
- Nilai Tertinggi ke-N dengan DENSE_RANK
- Penerima Penghasilan Tertinggi Per Departemen
- Mengembalikan NULL Saat Nilai ke-N Tidak Ada