PostgreSQL中查询第10高员工薪资的解决方案(含重复薪资场景)
获取第10高员工薪资的问题与解决方案
我创建了一张包含10条员工详情记录的表,尝试通过不同查询语句获取员工的第10高薪资,过程中遇到了一些问题,同时也找到了可行方案,具体如下:
1. 使用dense_rank()遇到的问题
尝试用dense_rank()查询的语句如下:
SELECT * from ( select emp_id, emp_name, designation, salary, dense_rank() over(order by salary desc) as dr from employee) as top_salary where dr = 7;
该查询返回了3条记录,由于使用dense_rank(),必须手动设置where dr = 7;即便改用rank(),也需要设置where dr = 8。但存在重复薪资时无法直接用dr = 10,请问有什么替代方案?
2. PostgreSQL中使用TOP语法失败的问题
尝试用TOP语法的查询语句如下:
SELECT TOP (1) Salary FROM ( SELECT DISTINCT TOP (10) Salary FROM Employee ORDER BY Salary DESC ) AS Emp ORDER BY Salary;
我在PostgreSQL中使用该查询,但因PostgreSQL不支持TOP语法而无法运行,请问还有其他解决方案吗?
目前可用的有效查询
方案一:使用ROW_NUMBER()
SELECT distinct salary,designation,emp_id, emp_name FROM ( SELECT designation,salary,emp_id, emp_name ,ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num FROM Employee ) AS ranked_salaries WHERE row_num = 10;
方案二:使用LIMIT和OFFSET
SELECT distinct(salary),designation,emp_id, emp_name FROM employee ORDER BY salary desc limit 1 offset 9;
内容的提问来源于stack exchange,提问作者Sonal Bhattacharya
相关产品推荐
相关产品推荐

