N Highest Salary In Sql

SQL is the most popular language used to manage and query data in relational databases. It was designed to enable users to access, structure, manipulate and control the data in their databases. SQL is one of the most widely taught skills in the world, and it’s also one of the highest paid skills.

According to Glassdoor’s report on the 25 highest paying jobs in America, SQL developers are among those who take home a hefty paycheck. In fact, they’re number two on that list—just below software engineers and web developers.

According to PayScale’s 2017 report on salary data for SQL developers, they earn an average annual salary of $79K with a range from $61K-$102K. Their median earnings are $73K per year.

N Highest Salary In Sql

This is a special type of subquery where the subquery depends upon the main query and execute for every row returned by the main query.  It’s slow but it can solve problems which are difficult to solve otherwise. Let’s see the SQL query to find the Nth highest salary using the Correlated subquery.

SQL Query:

SELECT name, salary 
FROM #Employee e1
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
WHERE e2.salary > e1.salary)

for the 2nd maximum you can replace N with 2, and for 3rd maximum replace N with 3, here is the output:

2nd highest salary:

SELECT name, salary 
FROM #Employee e1
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
WHERE e2.salary > e1.salary)SELECT name, salary 
FROM #Employee e1
WHERE 2-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
WHERE e2.salary > e1.salary)

Result:
name salary
Peter 5000

3rd highest salary:

SELECT name, salary 
FROM #Employee e1
WHERE 3-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
WHERE e2.salary > e1.salary)

Result:
name salary
John 4000

Explanation :

The distinct keyword is there to deal with duplicate salaries in the table. In order to find the Nth highest salary, we are only considering unique salaries. The highest salary means no salary is higher than it, the Second highest means only one salary is higher than it, 3rd highest means two salaries are higher than it, similarly Nth highest salary means N-1 salaries are higher than it.

Pros :
1) The generic solution works in all databases including Oracle, MySQL, SQL SERVER, and PostgreSQL.

Cons :
1) Slow, because the inner query will run for every row processed by the outer query.

See SQL Puzzles and Answers book for more of such SQL queries for practicing and improving your SQL query skill.

The nth highest salary in SQL SERVER using TOP keyword

You can use the TOP keyword to find the Nth highest salary in SQL SERVER. This is also faster than the previous solution because here we are calculating Nth maximum salary without a subquery.

SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP N salary
FROM #Employee
ORDER BY salary DESC
) AS temp
ORDER BY salary

Explanation: 

By default ORDER BY clause print rows in ascending order, since we need the highest salary at the top, we have used ORDER BY DESC, which will display salaries in descending order. Again DISTINCT is used to remove duplicates. The outer query will then pick the topmost salary, which would be your Nth highest salary.

And, if you like books and just learning these queries from the interview’s sake then I suggest you first read a good book on SQL like Head First SQL. It will help you to build your fundamentals.

3rd highest salary in SQL SERVER

SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP 3 salary
FROM #Employee
ORDER BY salary DESC
) AS temp
ORDER BY salary

Result:
salary
4000

Here is another example where we have used the TOP keyword to find the second highest salary in Microsoft SQL SERVER 2008.

Nth maximum salary in MySQL using LIMIT keyword

Similar to TOP, MySQL also supports a LIMIT keyword, which provides pagination capability. You can find the nth highest salary in MySQL without using subquery as shown below:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT N-1, 1

2nd highest salary in MySQL without subquery:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1
salary
5000

3rd highest salary in MySQL using LIMIT clause:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 2,1
salary
4000

Nth highest salary in MySQL using LIMIT clause:

SELECT salary FROM Employee  ORDER BY Salary DESC LIMIT n-1,1

Explanation :
The benefit of this approach is that it’s faster than a correlated query approach but its vendor dependent. This solution will only work in a MySQL database.

Nth highest salary in Oracle using ROW_NUMBER() function

SELECT * FROM (
SELECT e.*, 
ROW_NUMBER() OVER (ORDER BY salary DESC) rn 
FROM Employee e
)
WHERE rn = N; /*N is the nth highest salary*/

Here is the 2nd highest salary in Oracle using ROW_NUMBER() window function:

https://www.google.com/afs/ads?psid=5134551505&channel=AutoRsVariant&fexp=21404%2C17300002%2C17300953%2C17300954&iab_gdprApplies=false&client=pub-5808379456926196&r=m&hl=en&cpp=5&type=3&rs_tt=c&oe=UTF-8&ie=UTF-8&format=r5&nocache=6891655941282202&num=0&output=afd_ads&domain_name=javarevisited.blogspot.com&v=3&bsl=10&pac=2&u_his=50&u_tz=60&dt=1655941282203&u_w=1366&u_h=768&biw=1349&bih=657&psw=1349&psh=12780&frm=0&uio=-&cont=autors-container-0&jsid=csa&jsv=35962&rurl=https%3A%2F%2Fjavarevisited.blogspot.com%2F2016%2F01%2F4-ways-to-find-nth-highest-salary-in.html%23axzz7WzFCDMEG&referer=https%3A%2F%2Fwww.google.com%2F#master-1

SELECT * FROM (
SELECT e.*, 
ROW_NUMBER() OVER (ORDER BY salary DESC) rn 
FROM Employee e
)
WHERE rn = 2; 

Output
NAME   SALARY  RN
Peter   5000   2

and here is 3rd highest salary in Oracle:

SELECT * FROM (
SELECT e.*, 
ROW_NUMBER() OVER (ORDER BY salary DESC) rn 
FROM Employee e
)
WHERE rn = 3; 

By the above code has a problem. It is not handling duplicate salaries properly. For example, in our table we have two employees with salary 3000, that’s our 4th highest salary, but above code will print the same salary, albeit different employee for both 4th and 5th maximum as shown below:

SELECT * FROM (
SELECT e.*, 
ROW_NUMBER() OVER (ORDER BY salary DESC) rn 
FROM Employee e
)
WHERE rn = 5;

Result: 
NAME    SALARY  RN
Shane   3000    5

In oracle, you can also use SQL statements to build schema and run sample SQL.

You can also do the same thing by using the RANK() window function in Oracle, but that’s for another day. This is more than enough to answer the SQL interview question, the print nth highest salary of an employee in the Oracle.

That’s all about how to find the nth highest salary in SQL. The easiest way to find nth maximum/minimum salary is by using the correlated subquery, but it’s not the fastest way. Better ways are database dependent e.g. you cause TOP keyword in SQL SERVER, LIMIT keyword in MySQL, and ROW_NUMBER() window function in Oracle to calculate the nth highest salary. The normal subquery way is good for the second maximum but after that, it becomes really nested and cluttered.

Leave a Reply