Câu hỏi phổ biến và quan trọng nhất được hỏi trong các cuộc phỏng vấn rằng làm thế nào chúng ta có thể tìm thấy mức lương cao nhất thứ N trong bảng (mức lương cao nhất thứ 2, mức lương cao nhất thứ 3 hoặc mức lương cao nhất thứ N), trong đó N có thể là 2, 3, 4, 5 hoặc bất cứ thứ gì.
Mỗi lập trình viên đều biết cách dễ nhất để tìm được mức lương cao nhất là sử dụng SQL (Ngôn ngữ truy vấn có cấu trúc) trong một bảng.
Bất cứ khi nào người phỏng vấn hỏi bạn một câu hỏi về 2 mức lương cao nhất, 4 mức lương cao nhất, v.v. Để giải quyết câu hỏi này, chúng ta nên biết về một số khái niệm quan trọng như truy vấn con, hàm được sử dụng như row_num (), Rank Rank () , v.v.
Bài viết này sẽ cho bạn biết các cách khác nhau để tìm được N Mức lương cao nhất.
Hãy xem xét các bảng hiện có có các bản ghi sau:
Bảng:Nhân viên
EMPLOYEEID | FIRST_NAME | LAST_NAME | TIỀN LƯƠNG | THÀNH PHỐ | KHOA | 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 | ĐIỀU CHỈNH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50000 | MUMBAI | C # | 5 |
3001 | PRANOTI | CHIA SẺ | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | DÂY | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | MỤC TIÊU | 60500 | MUMBAI | KIỂM TRA | 4 |
4002 | ASHWINI | TÚI XÁCH | 54500 | NOIDA | JAVA | 3 |
4003 | RUCHIKA | AGARWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | KIỂM TRA | 4 |
N hững mức lương cao nhất sử dụng truy vấn con tương quan
Truy vấn con có tương quan là một loại truy vấn con đặc biệt, trong đó truy vấn con phụ thuộc vào truy vấn chính và được thực thi cho mọi hàng do truy vấn chính trả về.
Cú pháp:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Trong đó N có thể được thay thế bằng các số 23 hoặc 4.
Ví dụ 1: Viết truy vấn để tìm 4 mức lương cao nhất:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Trong đó N =4, N -1:4 -1 =3.
4 mức lương cao nhất bảng
Đầu ra:
Employeeid | Lương |
3003 | 58500 |
Giải thích:
Từ khóa khác biệt ở đó để xử lý các mức lương trùng lặp trong bảng. Để tìm kiếm N mức lương cao nhất, chúng tôi chỉ xem xét mức lương không trùng lặp. Mức lương cao nhất có nghĩa là không có mức lương nào cao hơn nó. Mức lương cao thứ hai có nghĩa là chỉ một mức lương lớn hơn nó. Mức lương cao thứ ba có nghĩa là chỉ có hai mức lương cao hơn mức lương thứ ba, tương tự mức lương cao nhất thứ N có nghĩa là mức lương N-1 lớn hơn mức đó.
Mức lương cao thứ tư là 58500 của id nhân viên 3003.
Ví dụ 2:Viết truy vấn để tìm 3 mức lương cao nhất:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Trong đó N =3, N -1:3 -1 =2.
2 mức lương cao nhất bảng
Đầu ra:
Employeeid | Lương |
1002 | 60000 |
4003 | 60000 |
Mức lương cao thứ hai là 58500 của hai id nhân viên 1002 và id nhân viên 4003.
Ví dụ 3:Viết truy vấn để tìm 5 mức lương cao nhất:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Trong đó N =6, N -1:6 -1 =5.
5 mức lương cao nhất bảng
Đầu ra:
Employeeid | Lương |
4002 | 54500 |
Mức lương cao thứ năm là 54500 của id nhân viên là 4002.
N Mức lương cao nhất bằng cách sử dụng từ khóa LIMIT
Cú pháp:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Ví dụ 1: Viết truy vấn để tìm 2 mức lương cao nhất.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Đầu ra:
Employeeid | Lương |
2002 | 65500 |
Giới hạn 1, 1 trong truy vấn cho biết mức lương cao nhất sẽ được hiển thị.
Nếu bạn viết 1, 2 đầu ra sẽ như thế này
Employeeid | Lương |
2002 | 65500 |
4001 | 60500 |
N Mức lương cao nhất khi sử dụng từ khóa TOP
Tình huống là tính N lương nhân viên cao nhất từ bảng nhân viên. Các bước như sau:
1. Bước đầu tiên là tìm kiếm mức lương duy nhất TOP của nhân viên từ bảng.
2. Bước tiếp theo là tính toán mức lương tối thiểu trong số tất cả các mức lương thu được từ bước đầu tiên. Đến bước này, chúng tôi nhận được N mức lương cao nhất.
3. Từ kết quả của các bước trên, xác định chi tiết người lao động có mức lương tối thiểu.
Ví dụ 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 ));
Câu lệnh SQL trên được sử dụng để tìm thông tin chi tiết về những nhân viên có mức lương Cao nhất.
Hãy xem giải thích ngắn gọn về câu lệnh SQL ở trên:
Coi N =4.
Bất cứ khi nào bất kỳ truy vấn SQL nào bao gồm một truy vấn phụ, hãy nhớ rằng truy vấn bên trong sẽ thực thi trước sau đó truy vấn bên ngoài sẽ được thực thi.
Kết quả sau sẽ được tạo ra bởi truy vấn "CHỌN TIỀN LỆNH ĐẦU N từ nhân viên ĐẶT HÀNG THEO MÔ TẢ lương", kết quả này sẽ tạo ra kết quả sau.
Mức lương |
65500 |
60500 |
60000 |
58500 |
Truy vấn bên ngoài tiếp theo là:"CHỌN MIN (lương) TỪ nhân viên TẠI ĐÂU lương IN (kết quả của truy vấn SQL trước đó.
Mức lương |
58500 |
Từ kết quả trên, xác minh rằng mức lương yêu cầu cao thứ tư là 58500.
Cuối cùng, truy vấn chính là SELECT * FROM nhân viên WHERE lương =kết quả của truy vấn SQL trước đó. Đầu ra của truy vấn này sẽ là kết quả của những nhân viên có mức lương cao thứ tư.
FIRST_NAME | TIỀN LƯƠNG |
DEEPAM | 58500 |
Ví dụ 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 ));
Câu lệnh SQL trên được sử dụng để tìm thông tin chi tiết về những nhân viên có mức lương cao nhất N.
Hãy xem giải thích ngắn gọn về câu lệnh SQL ở trên:
Coi N =5.
Bất cứ khi nào bất kỳ truy vấn SQL nào bao gồm một truy vấn phụ, hãy nhớ rằng truy vấn bên trong sẽ thực thi trước sau đó truy vấn bên ngoài sẽ được thực thi.
Kết quả sau sẽ được tạo ra bởi truy vấn "CHỌN TIỀN LỆNH ĐẦU N từ nhân viên ĐẶT HÀNG THEO MÔ TẢ lương", kết quả này sẽ tạo ra kết quả sau.
Mức lương |
65500 |
60500 |
60000 |
58500 |
55500 |
Truy vấn bên ngoài tiếp theo là:"CHỌN MIN (lương) TỪ nhân viên TẠI ĐÂU lương IN (kết quả của truy vấn SQL trước đó.
Mức lương |
55500 |
Từ kết quả trên, xác minh rằng mức lương yêu cầu cao thứ năm là 55500.
Cuối cùng, truy vấn chính là SELECT * FROM nhân viên WHERE lương =kết quả của truy vấn SQL trước đó. Đầu ra của truy vấn này sẽ là kết quả của những nhân viên có mức lương cao thứ năm.
FIRST_NAME | TIỀN LƯƠNG |
PRACHI | 55500 |
Mức lương cao nhất thứ N khi sử dụng hàm Row_Num ()
Ví dụ:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- Để tính mức lương cao thứ ba, hãy sử dụng rownum <4
- Để tính mức lương cao thứ hai, hãy sử dụng rownum <3
Đầu ra:
MIN (lương |
60500 |
Hãy xem cách truy vấn hoạt động:
Bước 1: Truy vấn bao gồm truy vấn con nghĩa là truy vấn bên trong và truy vấn bên ngoài. Tất cả chúng ta đều biết khi truy vấn con được sử dụng trong truy vấn, truy vấn bên trong được thực thi đầu tiên
Đầu tiên, truy vấn bên trong sẽ được thực thi sau đó các truy vấn bên ngoài sẽ được thực thi dựa trên kết quả do truy vấn bên trong tạo ra:
Truy vấn bên trong:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Đầu ra của truy vấn bên trong:
Mức lương |
65500 |
60500 |
60000 |
58500 |
55500 |
54500 |
50500 |
50000 |
Khi chúng tôi sử dụng một từ khóa riêng biệt trong truy vấn, mức lương trùng lặp sẽ bị loại bỏ. Mức lương duy nhất sẽ được hiển thị do kết quả của truy vấn bên trong.
Bước 2: Khi máy chủ được thực hiện với truy vấn bên trong, chúng tôi đang thực hiện truy vấn bên ngoài của truy vấn lồng vào kết quả mà chúng tôi thu được từ truy vấn bên trong
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
SELECT MIN (lương) FROM (đầu ra truy vấn bên trong):chọn mức lương tối thiểu từ đầu ra truy vấn bên trong, là 50000 và 50000 không phải là mức lương cao thứ hai, vì chúng tôi đã sử dụng rownum <3, điều này sẽ cho số các hàng từ trên cùng nhỏ hơn 3 nghĩa là chỉ có 2.
Đầu ra của WHERE rownum <3:
Mức lương |
65500 |
60500 |
Bước 3: Phần cuối cùng của truy vấn, là SELECT MIN (lương) từ (đầu ra của WHERE rownum <3):
Kết quả cuối cùng của truy vấn:
Mức lương |
60500 |
60500 là mức lương cao thứ hai trong bảng của nhân viên.
Mức lương cao nhất thứ N sử dụng hàm Rank Rank ()
Ví dụ:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- Để tính mức lương cao thứ ba, hãy sử dụng num =3
- Để tính mức lương cao thứ hai, hãy sử dụng num =2
Chúng tôi sẽ đi cho num =2.
Kết quả cuối cùng:
First_Name | Lương | Xếp hạng |
Rajesh | 60500 | 2 |
O đầu ra của truy vấn bên trong:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
Hàm Dense_rank () tính Xếp hạng của mỗi hàng trong một nhóm thứ tự các hàng theo thứ tự tăng dần và trả về Xếp hạng dưới dạng một số. Xếp hạng bắt đầu từ 1 và cứ tiếp tục như vậy.
Trong trường hợp hai hoặc nhiều hơn hai hàng có cùng mức lương, nó sẽ gán một thứ hạng bằng nhau cho tất cả các hàng.
Đầu ra của truy vấn bên trong:
First_name | Lương | Xếp hạng |
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 | 50000 | 8 |
Trong đầu ra, chúng ta có thể thấy cùng một thứ hạng để trùng lặp mức lương.
Bước 2: Khi máy chủ được thực hiện với truy vấn bên trong, chúng tôi đang thực hiện truy vấn bên ngoài của truy vấn lồng vào kết quả mà chúng tôi thu được từ truy vấn bên trong
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Chọn * từ sẽ chọn tất cả các hàng không có mức lương cao thứ hai vì chúng tôi đã sử dụng Xếp hạng trong đó num =2 sẽ cung cấp các hàng phù hợp theo giá trị mà người dùng đã nhập cho num.
Khi chúng tôi sử dụng num =2, đầu ra sẽ là
First_name | Lương | Xếp hạng |
RAJESH | 60500 | 2 |
- Để tìm mức lương thứ ba, num =3,
- Để tìm mức lương thứ tư, num =4, v.v.