SQL多字段复合排序后筛选奇数行的查询实现问题
原SQL存在的问题
- 关联条件错误:两张表的关联逻辑不符合业务设计,学生表的
department字段存储的是对应院系的dept_id,正确关联条件应该是E.department = D.dept_id,原语句写的dept_id=student_id完全不匹配对应关系,无法得到正确的院系-学生关联数据。 - 人数筛选条件错误:需求要求筛选学生人数少于5人的院系,原语句写的
total_students<3不符合要求。 - 行号生成逻辑错误:
ROW_NUMBER() OVER()没有指定窗口内的排序规则,行号生成顺序是随机的,无法和要求的排序规则对齐,导致奇偶行筛选结果不符合预期。 - 表关联方向不合理:如果要覆盖所有院系的统计情况,应该以院系表为主表左连学生表,避免漏掉没有学生的院系,原语句以学生表左连院系表会丢失无学生的院系数据。
正确实现SQL
SELECT name, total_students, total_score FROM ( SELECT D.dept_id, D.name, COUNT(E.student_id) AS total_students, COALESCE(SUM(E.score), 0) AS total_score, ROW_NUMBER() OVER(ORDER BY SUM(E.score) DESC, COUNT(E.student_id) DESC, D.dept_id ASC) AS row_id FROM school_dept D LEFT JOIN Students E ON D.dept_id = E.department GROUP BY D.dept_id, D.name HAVING COUNT(E.student_id) < 5 ) AS t WHERE row_id % 2 != 0;
执行后输出结果和预期一致:
| name | total_students | total_score |
|---|---|---|
| Admin | 1 | 11 |
| Physics | 1 | 11 |
| Mathematics | 1 | 11 |
内容的提问来源于stack exchange,提问作者shockwave
相关产品推荐
相关产品推荐

