如何对salary表按deptid分组求和后,获取最大值与第二大值及对应部门
方案1:简单排序取值(适配大多数支持LIMIT的数据库)
如果你不需要处理并列排名的场景,直接对分组求和后的结果按薪资总和倒序,取前2条即可,同时可以返回对应的部门ID:
SELECT deptid, SUM(salary) AS dept_total_salary FROM salary GROUP BY deptid ORDER BY dept_total_salary DESC LIMIT 2;
方案2:窗口函数实现(适配支持窗口函数的数据库,可处理并列排名)
如果需要处理多部门薪资总和并列的场景,推荐用DENSE_RANK窗口函数实现,排名逻辑更可控:
WITH dept_salary_summary AS ( SELECT deptid, SUM(salary) AS dept_total_salary, -- 按部门薪资总和倒序排名,并列值排名相同,不跳过后续排名位 DENSE_RANK() OVER(ORDER BY SUM(salary) DESC) AS salary_rank FROM salary GROUP BY deptid ) SELECT deptid, dept_total_salary FROM dept_salary_summary WHERE salary_rank <= 2;
如果需要并列后跳过排名位,可以把DENSE_RANK替换为RANK函数。
原有语句错误原因
- WHERE子句中
IN关键字前缺少匹配的字段,语法不合法 - 子查询没有按
deptid分组,返回的是全表薪资总和,不是各部门的汇总结果
内容的提问来源于stack exchange,提问作者Shubham Kandpal
相关产品推荐
相关产品推荐

