Find Nth largest salary from a table, for example in below example 3rd largest salary has been queried from SQL database...
Let's take a table TEST as below:
Name | Dept | Salary |
Ram | Marketing | 1700 |
Hari | Technical | 1000 |
Gopal | Electrical | 1100 |
Kris | Driver | 900 |
Muni | ComputerTech | 2500 |
Sam | Dept Head | 3000 |
Sita | Sales | 1250 |
Geeta | HR | 1900 |
Select * from Test order by Salary desc ;
Name | Dept | Salary |
Sam | Dept Head | 3000 |
Muni | ComputerTech | 2500 |
Geeta | HR | 1900 |
Ram | Marketing | 1700 |
Sita | Sales | 1250 |
Gopal | Electrical | 1100 |
Hari | Technical | 1000 |
Kris | Driver | 900 |
1st way to get the 3rd largest salary:
Select Name, Dept, max(salary) from Test where Salary < (Select max(Salary) from Test where Salary < (Select max(Salary) from Test)); NOTE: This does not give correct result when there is duplicate values
Name | Dept | max(salary) |
Geeta | HR | 1900 |
Get 3rd LOWEST salary:
Select Name, Dept, min(salary) from Test where Salary > (Select min(Salary) from Test where Salary > (Select min(Salary) from Test)); NOTE: This does not give correct result when there is duplicate values
Name | Dept | min(salary) |
Gopal | Electrical | 1100 |
2nd way to get the 3rd largest salary:
Select name, dept, min(salary) as ThirdMINSal from (Select * from (Select * from Test order by Salary desc) where rownum<4) ; NOTE: This is an old way in ORACLE and This does not give correct result when there is duplicate values
Select name, dept, min(salary) as ThirdMINSal from (Select * from (Select * from Test order by Salary desc) FETCH FIRST 3 ROWS ONLY); NOTE: This is new way in Oracle and This does not give correct result when there is duplicate values
3rd way to get the 3rd largest salary:
Using DENSE_RANK() ---SQL query in progress
In MySQL
Select name, dept, min(salary) as ThirdMINSal from (Select * from (Select * from Test order by Salary desc) limit 3); NOTE: This does not give correct result when there is duplicate values
|
||||||||
EXAMPLE 2(with duplicate value):
Select * from TableUnitTest order by salary desc;
| |||||||||||||||||||||||
Select * from TableUnitTest where salary = (Select min(Salary) from (Select salary from ( Select Distinct salary from TableUnitTest order by salary desc ) limit 3));
| |||||||||||||||||||||||
No comments:
Post a Comment