Pertanyaan paling umum dan penting yang ditanyakan dalam wawancara adalah bagaimana kita dapat menemukan gaji tertinggi ke-N dalam sebuah tabel (2 gaji tertinggi, 3 gaji tertinggi, atau gaji tertinggi ke-N), di mana N bisa menjadi 2, 3, 4, 5 atau apa pun.
Setiap programmer tahu cara termudah untuk menemukan n gaji tertinggi adalah dengan menggunakan SQL (Structured Query Language) dalam sebuah tabel.
Setiap kali pewawancara mengajukan pertanyaan tentang 2 gaji tertinggi, 4 gaji tertinggi, dan seterusnya, untuk menyelesaikan pertanyaan ini, kita harus mengetahui beberapa konsep penting seperti subquery, fungsi yang akan digunakan seperti row_num(), Rank Rank() , dll.
Artikel ini akan memberi tahu Anda berbagai cara untuk menemukan Gaji Tertinggi N.
Pertimbangkan tabel yang ada yang memiliki catatan berikut:
Tabel:Karyawan
KARYAWAN | FIRST_NAME | LAST_NAME | GAJI | KOTA | DEPARTEMEN | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | C# | 5 |
1003 | NIKHIL | VANI | 50500 | JAIPUR | FMW | 2 |
2001 | PRACHI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | C# | 5 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | BAIK | 60500 | MUMBAI | UJI | 4 |
4002 | ASHWINI | BAGHAT | 54500 | NOIDA | JAVA | 3 |
4003 | RUCHIKA | AGRWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARKIT | SHARMA | 55500 | DELHI | UJI | 4 |
N gaji tertinggi menggunakan subquery yang berkorelasi
Subquery berkorelasi adalah jenis subquery khusus, di mana subquery bergantung pada kueri utama dan dijalankan untuk setiap baris yang dikembalikan oleh kueri utama.
Sintaks:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dimana N bisa diganti dengan angka 23, atau 4.
Contoh 1: Tulis kueri untuk menemukan 4 gaji tertinggi:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dimana N =4, N -1:4 -1 =3.
4 gaji tertinggi dari tabel
Keluaran:
Karyawan | Gaji |
3003 | 58500 |
Penjelasan:
Kata kunci yang berbeda ada untuk menangani gaji yang digandakan dalam tabel. Untuk mencari N gaji tertinggi, kami hanya mempertimbangkan gaji non-duplikat. Gaji tertinggi berarti tidak ada gaji yang lebih tinggi darinya. Gaji tertinggi kedua berarti hanya satu gaji yang lebih besar dari itu. Gaji tertinggi ketiga berarti hanya dua gaji yang lebih tinggi dari gaji ketiga, demikian pula gaji tertinggi ke-N berarti gaji N-1 lebih besar dari itu.
Gaji tertinggi keempat adalah 58500 id karyawan 3003.
Contoh 2:Tulis kueri untuk menemukan 3 gaji tertinggi:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dimana N =3, N -1:3 -1 =2.
2 gaji tertinggi dari tabel
Keluaran:
Karyawan | Gaji |
1002 | 60000 |
4003 | 60000 |
Gaji tertinggi kedua adalah 58500 dari dua id karyawan 1002 dan id karyawan 4003.
Contoh 3:Tulis kueri untuk menemukan 5 gaji tertinggi:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dimana N =6, N -1:6 -1 =5.
5 gaji tertinggi dari tabel
Keluaran:
Karyawan | Gaji |
4002 | 54500 |
Gaji tertinggi kelima adalah 54.500 id karyawan 4002.
N Gaji tertinggi menggunakan LIMIT kata kunci
Sintaks:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Contoh 1: Tulis kueri untuk menemukan 2 gaji tertinggi.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Keluaran:
Karyawan | Gaji |
2002 | 65500 |
Batas 1, 1 dalam kueri mengatakan berapa gaji tertinggi yang akan ditampilkan.
Jika Anda menulis 1, 2 output akan seperti ini
Karyawan | Gaji |
2002 | 65500 |
4001 | 60500 |
N Gaji tertinggi menggunakan kata kunci TOP
Skenarionya adalah menghitung N gaji pegawai tertinggi dari tabel pegawai. Langkah-langkahnya adalah sebagai berikut:
1. Langkah pertama adalah mencari gaji unik TOP karyawan dari tabel.
2. Langkah selanjutnya adalah menghitung gaji minimum di antara semua gaji yang dihasilkan dari langkah pertama. Dengan langkah ini, kita mendapatkan N gaji tertinggi.
3. Dari hasil langkah-langkah di atas, mengidentifikasi rincian karyawan yang gajinya adalah gaji minimum.
Contoh 1:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));
Pernyataan SQL di atas digunakan untuk mencari rincian karyawan dengan gaji tertinggi.
Mari kita lihat penjelasan dari pernyataan SQL di atas secara singkat:
Pertimbangkan N =4.
Setiap kali kueri SQL menyertakan sub-kueri, ingat kueri dalam akan dieksekusi terlebih dahulu, lalu kueri luar akan dieksekusi.
Hasil berikut akan dihasilkan oleh kueri "SELECT DISTINCT TOP N gaji dari karyawan ORDER BY salary DESC", yang akan menghasilkan hasil berikut.
Gaji |
65500 |
60500 |
60000 |
58500 |
Query luar berikutnya adalah:"SELECT MIN(salary) FROM employee WHERE salary IN (output dari query SQL sebelumnya.
Gaji |
58500 |
Dari hasil di atas, diverifikasi bahwa gaji tertinggi keempat yang dibutuhkan adalah 58500.
Terakhir, query utama adalah SELECT * FROM employee WHERE salary =output dari query SQL sebelumnya. Output dari query ini adalah hasil dari karyawan yang memiliki gaji tertinggi keempat.
FIRST_NAME | GAJI |
DEEPAM | 58500 |
Contoh 2:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));
Pernyataan SQL di atas digunakan untuk mencari rincian karyawan dengan gaji tertinggi N.
Mari kita lihat penjelasan dari pernyataan SQL di atas secara singkat:
Pertimbangkan N =5.
Setiap kali kueri SQL menyertakan sub-kueri, ingat kueri dalam akan dieksekusi terlebih dahulu, lalu kueri luar akan dieksekusi.
Hasil berikut akan dihasilkan oleh kueri "SELECT DISTINCT TOP N gaji dari karyawan ORDER BY salary DESC", yang akan menghasilkan hasil berikut.
Gaji |
65500 |
60500 |
60000 |
58500 |
55500 |
Query luar berikutnya adalah:"SELECT MIN(salary) FROM employee WHERE salary IN (output dari query SQL sebelumnya.
Gaji |
55500 |
Dari hasil di atas, diverifikasi bahwa gaji tertinggi kelima yang dibutuhkan adalah 55.500.
Terakhir, query utama adalah SELECT * FROM employee WHERE salary =output dari query SQL sebelumnya. Output dari query ini adalah hasil dari karyawan yang memiliki gaji tertinggi kelima.
FIRST_NAME | GAJI |
PRACHI | 55500 |
Gaji tertinggi ke-N menggunakan fungsi Row_Num()
Contoh:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- Untuk menghitung gaji tertinggi ketiga, gunakan rownum <4
- Untuk menghitung gaji tertinggi kedua, gunakan rownum <3
Keluaran:
MIN(gaji |
60500 |
Mari kita lihat cara kerja kueri:
Langkah 1: Kueri termasuk subquery berarti kueri dalam dan kueri luar. Kita semua tahu ketika subquery digunakan dalam kueri, kueri dalam pertama kali dieksekusi
Pertama, inner query akan dieksekusi kemudian outer query akan dieksekusi berdasarkan output yang dihasilkan inner query:
Kueri batin:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Keluaran dari kueri dalam:
Gaji |
65500 |
60500 |
60000 |
58500 |
55500 |
54500 |
50500 |
50.000 |
Karena kami menggunakan kata kunci yang berbeda dalam kueri, gaji duplikat akan dihilangkan. Gaji unik akan ditampilkan sebagai hasil dari inner query.
Langkah 2: Saat server selesai dengan kueri dalam, kami mengeksekusi kueri luar dari kueri bersarang ke dalam output yang kami peroleh dari kueri dalam
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
PILIH MIN(gaji) DARI (output kueri dalam):pilih gaji minimum dari output kueri dalam, yaitu 50000 dan 50000 bukan gaji tertinggi kedua, karena itu kami telah menggunakan rownum <3, yang akan memberikan jumlah baris dari atas yang kurang dari 3 berarti hanya 2.
Output dari WHERE rownum <3:
Gaji |
65500 |
60500 |
Langkah 3: Bagian terakhir dari kueri, yang merupakan SELECT MIN(gaji) dari (output dari WHERE rownum<3):
Hasil akhir dari kueri:
Gaji |
60500 |
60.500 adalah gaji tertinggi kedua di meja karyawan.
Gaji tertinggi ke-N menggunakan fungsi Rank Rank()
Contoh:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- Untuk menghitung gaji tertinggi ketiga, gunakan num =3
- Untuk menghitung gaji tertinggi kedua, gunakan num =2
Kami akan memilih num =2.
Hasil akhir:
First_Name | Gaji | Peringkat |
Rajesh | 60500 | 2 |
O output dari kueri dalam:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
Fungsi Dense_rank() menghitung Peringkat setiap baris dalam kelompok urutan baris dalam urutan menaik dan mengembalikan Peringkat sebagai angka. Peringkat dimulai dari 1 dan seterusnya.
Dalam hal dua atau lebih dari dua baris memiliki gaji yang sama, itu memberikan peringkat yang sama untuk semua baris.
Keluaran dari kueri dalam:
Nama_depan | Gaji | Peringkat |
VAIBHAVI | 65500 | 1 |
BHAVESH | 65500 | 1 |
RAJESH | 60500 | 2 |
VAIBHAV | 60000 | 3 |
RUCHIKA | 60000 | 3 |
DEEPAM | 58500 | 4 |
PRACHI | 55500 | 5 |
PRANOTI | 55500 | 5 |
ARCHIT | 55500 | 5 |
ASHWINI | 54500 | 6 |
NIKHIL | 50500 | 7 |
ANUJA | 50500 | 7 |
RUCHIKA | 50.000 | 8 |
Pada output, kita dapat melihat peringkat yang sama untuk menduplikasi gaji.
Langkah 2: Saat server selesai dengan kueri dalam, kami mengeksekusi kueri luar dari kueri bersarang ke dalam output yang kami peroleh dari kueri dalam
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Select * from akan memilih semua baris yang bukan merupakan gaji tertinggi kedua karena kita telah menggunakan RankRank dimana num =2 akan memberikan baris yang cocok sesuai dengan nilai yang dimasukkan oleh pengguna untuk num.
Seperti yang kita gunakan num =2, outputnya adalah
Nama_depan | Gaji | Peringkat |
RAJESH | 60500 | 2 |
- Untuk mencari set gaji ketiga num =3,
- Untuk mencari set gaji keempat num =4, dan seterusnya.