SQL中按学生‘F’数量降序排序数据表的实现方法
嘿,这个排序需求我很熟,给你两种靠谱的SQL实现方案,完全能满足你的要求~
解决Student表按‘F’数量排序的SQL方案
问题梳理
先明确下你的需求和原始数据:
原始Student表数据:
| 学生ID | 科目 | 成绩 |
|---|---|---|
| Student 1 | Math | F |
| Student 2 | Math | F |
| Student 2 | English | F |
| Student 2 | Science | F |
| Student 2 | History | P |
| Student 3 | Math | F |
| Student 3 | English | F |
| Student 3 | Science | F |
| Student 3 | Biology | F |
你的核心需求是:把所有学生的记录按该学生获得‘F’的数量从多到少排序,也就是F最多的学生的所有记录排在最前面(比如Student 3的4个F记录先出),然后是F数量次多的学生,以此类推。
两种SQL实现方法
方法1:子查询关联(兼容绝大多数SQL数据库)
这种写法兼容性拉满,几乎所有支持SQL的数据库都能运行:
SELECT s.* FROM Student s INNER JOIN ( -- 先统计每个学生的F成绩总数 SELECT 学生ID, COUNT(*) AS f_total FROM Student WHERE 成绩 = 'F' GROUP BY 学生ID ) student_f_counts ON s.学生ID = student_f_counts.学生ID -- 排序规则:优先按F数量降序,后续字段可选(保证同学生记录有序) ORDER BY student_f_counts.f_total DESC, s.学生ID, s.科目;
方法2:窗口函数(更简洁,适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如MySQL 8+/PostgreSQL/SQL Server等),这种写法更清爽,不需要额外的子查询关联:
SELECT *, -- 按学生分组,实时统计该学生的F数量 COUNT(CASE WHEN 成绩 = 'F' THEN 1 END) OVER (PARTITION BY 学生ID) AS f_total FROM Student -- 排序规则:F数量降序优先,后续字段按需添加 ORDER BY f_total DESC, 学生ID, 科目;
关键逻辑说明
- 统计F数量:两种方法的核心都是先计算每个学生的‘F’成绩总数,这个数值是排序的核心依据。
- 排序规则:
ORDER BY f_total DESC确保F最多的学生排在最前面;后面的学生ID和科目是可选字段,用来保证同一学生的记录有固定的排列顺序(比如按科目名称排序),如果不需要可以直接去掉。 - 结果验证:执行上述任意一种SQL,都会得到你预期的排序结果:
Student 3 | Math |F
Student 3 | Science |F
Student 3 | English |F
Student 3 | Biology |F
Student 2 | Math |F
Student 2 | English |F
Student 2 | Science |F
Student 2 | History |P
Student 1 | Math |F
内容的提问来源于stack exchange,提问作者Link
相关产品推荐
相关产品推荐

