PostgreSQL Subquery: Get nth maximum of salaries
21. Write a query to get nth max salaries of employees.
Sample Solution:
Code:
-- This SQL query retrieves records from the employees table where each employee's salary is the highest among all distinct salary values in the employees table.
SELECT * -- Selects all columns from the employees table (aliased as 'emp1')
FROM employees emp1 -- Specifies the table from which to retrieve data (aliased as 'emp1'), in this case, the employees table
WHERE (1) = ( -- Filters the rows to include only those where the count of distinct salary values greater than the salary of the current row is equal to 1
SELECT COUNT(DISTINCT(emp2.salary)) -- Subquery: Counts the distinct salary values greater than the salary of the current row
FROM employees emp2 -- Specifies the table from which to retrieve data (aliased as 'emp2'), in this case, the employees table
WHERE emp2.salary > emp1.salary -- Filters distinct salary values greater than the salary of the current row (aliased as 'emp1')
);
Explanation:
- This SQL query retrieves records from the employees table where each employee's salary is the highest among all distinct salary values in the employees table.
- The outermost SELECT statement retrieves all columns from the employees table (aliased as 'emp1').
- The WHERE clause filters the rows to include only those where the count of distinct salary values greater than the salary of the current row is equal to 1.
- The subquery calculates the count of distinct salary values greater than the salary of the current row.
Sample table: employees
Output:
pg_exercises=# SELECT * pg_exercises-# FROM employees emp1 pg_exercises-# WHERE (1) = ( pg_exercises(# SELECT COUNT(DISTINCT(emp2.salary)) pg_exercises(# FROM employees emp2 pg_exercises(# WHERE emp2.salary > emp1.salary); employee_id | first_name | last_name | email | phone_number | hire_date | job_id | salary | commission_pct | manager_id | department_id -------------+------------+-----------+---------------+--------------+------------+--------+----------+----------------+------------+--------------- 101 | Neena | Kochhar | not available | 515.123.4568 | 1987-06-18 | AD_VP | 17000.00 | 0.00 | 100 | 90 102 | Lex | De Haan | not available | 515.123.4569 | 1987-06-19 | AD_VP | 17000.00 | 0.00 | 100 | 90 (2 rows)
Practice Online
Have another way to solve this solution? Contribute your code (and comments) through Disqus.
Previous: Write a query to get three minimum salaries.
Next: PostgreSQL Exercises, Practice, Solution
What is the difficulty level of this exercise?
It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.
https://w3resource.com/postgresql-exercises/subquery/postgresql-subquery-exercise-21.php
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics