Method 1 SQL:-
SQL Server 2nd, 3rd, 4th... Highest salary using MAX, DENSE_RANK, and SUB QUERY!
We can find the 2nd, 3rd, 4th ... nth highest salary using SQL Server the below query, In the below query use top 1 for the 2nd highest salary, top 2 for the 3rd highest salary, top 3 for the 4th highest salary,.... nth for the (n+1) highest salary.
Method 2 for MySQL:-
You can use LIMIT to get 2nd, 3rd, 4th ... nth highest salary!
Examples using MAX, DENSE_RANK in SQL
====================================
DECLARE @Employees TABLE (
employee_id INT,
name VARCHAR(25),
salary INT
)
INSERT INTO @Employees (employee_id, name, salary)
VALUES
(1, 'Anil', 62000),
(2, 'Alok', 55000),
(3, 'Ajay', 70000),
(4, 'Rahul', 62000),
(5, 'Diya', 75000);
SELECT
SALARY,
DENSE_RANK() OVER (ORDER BY SALARY DESC) AS SALARY_RANK
FROM @Employees
/*Example 1 with Max*/
============================================
SELECT MAX(salary) AS SecondHighestSalary
FROM @Employees
WHERE salary < (SELECT MAX(salary) FROM @Employees);
/*Example 2 with DENSE_RANK*/
================================================
;with cte as (
select salary, dense_rank() over( order by salary desc) as SalaryRank
from @Employees
)
select * from cte where SalaryRank=2 -- 2 = 2nd Highest Salary, 3 = 3rd Highest Salary, n = nth Highest Salary
/*********************************************************/
The expression in your query is:
DENSE_RANK() OVER (ORDER BY salary DESC) AS rank
Is this PARTITION BY or ORDER BY?
- This
is only ORDER BY, not PARTITION BY.
- Your
query uses ORDER BY only — to
rank salaries from highest to lowest across the entire table.
- There
is no partitioning of data happening here.
Explanation:
- The OVER
clause in window functions can have two parts:
- PARTITION
BY — divides the data into groups (partitions) and the function is
applied within each partition separately.
- ORDER
BY — defines the order of rows within each partition (or the
entire dataset if no partition is specified).
In your case:
- Since
there is no PARTITION BY, the entire employee table is treated as one
single partition.
- The DENSE_RANK()
ranks salaries across all employees ordered by salary DESC.
What if you had PARTITION BY?
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY
salary DESC) AS rank
This would rank salaries within each department separately.
/*********************************************************/
The examples using SUB QUERY,
--QUERY FOR THE 2ND HIGHEST SALARY SELECT MAX(salary) AS [2ndHighestSalary] FROM Employee WHERE salary not in (SELECT TOP 1 salary FROM Employee GROUP BY salary ORDER BY salary DESC) --QUERY FOR THE 3RD HIGHEST SALARY SELECT MAX(salary) AS [3rdHighestSalary] FROM Employee WHERE salary not in (SELECT TOP 2 salary FROM Employee GROUP BY salary ORDER BY salary DESC) --QUERY FOR THE 4TH HIGHEST SALARY SELECT MAX(salary) AS [4thHighestSalary] FROM Employee WHERE salary not in (SELECT TOP 3 salary FROM Employee GROUP BY salary ORDER BY salary DESC) --QUERY FOR THE 5TH HIGHEST SALARY SELECT MAX(salary) AS [5thHighestSalary] FROM Employee WHERE salary not in (SELECT TOP 4 salary FROM Employee GROUP BY salary ORDER BY salary DESC) --QUERY FOR THE NTH HIGHEST SALARY SELECT MAX(salary) AS [nthHighestSalary] FROM Employee WHERE salary not in (SELECT TOP (n-1) salary FROM Employee GROUP BY salary ORDER BY salary DESC)
In MySQL simple and sweeter 2nd, 3rd, 4th... Highest salary.
You can use LIMIT to get highest salary!
Examples using MySQL LIMIT,
--QUERY FOR THE 2ND HIGHEST SALARY USINGH LIMIT SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1, 1; --QUERY FOR THE 3rd HIGHEST SALARY USINGH LIMIT SELECT salary FROM Employee ORDER BY salary DESC LIMIT 2, 1; --QUERY FOR THE 4th HIGHEST SALARY USINGH LIMIT SELECT salary FROM Employee ORDER BY salary DESC LIMIT 3, 1;
I hope you are enjoying with this post! Please share with
you friends. Thank you!