PostgreSQL用GROUP BY按城市分组后如何查询对应最高薪资的员工姓名
实现每个城市最高薪资对应员工查询的SQL方案
已知employee表包含字段id、name、city、salary,针对需求提供两种主流实现方案:
方案1:子查询+JOIN(兼容所有主流数据库版本)
先通过GROUP BY拿到每个城市的最高薪资,再和原员工表关联匹配即可,适配MySQL 5.x等不支持窗口函数的旧版本数据库:
SELECT e.city, e.name, e.salary FROM employee e INNER JOIN ( SELECT city, MAX(salary) AS max_salary FROM employee GROUP BY city ) t ON e.city = t.city AND e.salary = t.max_salary;
如果同一个城市有多名员工薪资相同且都是最高值,该语句会全部返回符合条件的记录。
方案2:窗口函数(适配支持SQL:2003标准的新版本数据库)
用RANK()窗口函数按城市分组对薪资降序排序,筛选排名第一的记录即可,写法更简洁:
SELECT city, name, salary FROM ( SELECT city, name, salary, RANK() OVER (PARTITION BY city ORDER BY salary DESC) AS salary_rank FROM employee ) t WHERE salary_rank = 1;
如果需要同一城市仅返回一条最高薪资记录,可以把RANK()替换为ROW_NUMBER(),搭配额外排序规则即可确定唯一返回值。
内容的提问来源于stack exchange,提问作者spraj
相关产品推荐
相关产品推荐

