Monday, December 7, 2015

How to get nth(1 or 2 or 3) highest salary in sql

--create table with Name Employee
CREATE TABLE Employee
(
id INT,
name VARCHAR(50),
salary INT
)

--Insert records in Employee table
INSERT INTO Employee VALUES(1,'ram',3000)
INSERT INTO Employee VALUES(2,'sita',3000)
INSERT INTO Employee VALUES(3,'Jit',600)
INSERT INTO Employee VALUES(4,'gita',30600)
INSERT INTO Employee VALUES(5,'Jai',3000)
INSERT INTO Employee VALUES(6,'ramu',30500)
INSERT INTO Employee VALUES(7,'ramu',4000)
INSERT INTO Employee VALUES(8,'ramu',5000)

--2nd highest salary using MAX
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
SELECT MAX(salary) As Salary From Employee Where Salary<(Select MAX(Salary) FROM Employee)

--3rd highest salary using MAX
SELECT MAX(salary) As Salary From Employee Where Salary<(Select MAX(Salary) FROM Employee
where Salary <(SELECT MAX(Salary) FROM Employee))

--3rd highest salary using sub query
SELECT TOP 1 Salary AS '3rd Highest Salary'
FROM (SELECT DISTINCT TOP 3 Salary FROM Employee ORDER BY Salary DESC) Result
ORDER BY Salary ASC

--3rd lowest salary using sub query
SELECT  TOP 1 Salary AS '3rd Lowest Salary'
FROM (SELECT DISTINCT TOP 3 Salary FROM Employee ORDER BY Salary ASC) Result
ORDER BY Salary DESC

--Nth highest salary using CTE with ROW_NUMBER function
--Disadvantage: It will not work with duplicate record
WITH CTE AS
(SELECT *,RN = ROW_NUMBER() OVER (ORDER BY Salary DESC) FROM Employee)
SELECT * FROM CTE WHERE RN = 3--(It can be nth)

--Nth highest salary using CTE with DENSE_RANK function
WITH EmployeeCTE AS
(SELECT *, DENSE_RANK() OVER (ORDER BY Salary DESC) AS DN  FROM  Employee)
SELECT TOP 1 salary FROM EmployeeCTE WHERE DN = 5 --(It can be nth)

--Nth highest salary 0 -max,1-2nd using sub query
SELECT * FROM Employee Emp1
WHERE (1) = (SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary)

--Nth highest salary and dense rank using with DENSE_RANK function
SELECT * FROM (SELECT *,DENSE_RANK() OVER(ORDER BY Salary)
As RowNum  FROM Employee) As Record WHERE Record.RowNum IN (3,3)
               

No comments:

Post a Comment

Find the value from array when age is more than 30

 const data = [   { id: 1, name: 'Alice', age: 25 },   { id: 2, name: 'Bob', age: 30 },   { id: 3, name: 'Charlie', ...