You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中按学生‘F’数量降序排序数据表的实现方法

嘿,这个排序需求我很熟,给你两种靠谱的SQL实现方案,完全能满足你的要求~

解决Student表按‘F’数量排序的SQL方案

问题梳理

先明确下你的需求和原始数据:
原始Student表数据:

学生ID科目成绩
Student 1MathF
Student 2MathF
Student 2EnglishF
Student 2ScienceF
Student 2HistoryP
Student 3MathF
Student 3EnglishF
Student 3ScienceF
Student 3BiologyF

你的核心需求是:把所有学生的记录按该学生获得‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:35:30