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

如何在SQL Server中选取指定学生的两项最高学费会话数据?

解决指定学生前两项最高学费会话数据的查询问题

嘿,我来帮你搞定这个查询需求!要获取指定学生的前两项最高学费对应的会话数据,单纯用MAX()确实只能拿到单个最大值,咱们可以用以下两种常用方案来实现:

方案一:窗口函数法(推荐,支持多数现代数据库)

这种方法用ROW_NUMBER()窗口函数给每个学生的学费记录按降序排序并编号,筛选出编号前2的记录即可,还能灵活处理并列情况(如果需要的话可以换成RANK())。

SELECT 
    sfr.StudentId,
    sfr.SessionId,
    sfr.TutionFee,
    ses.SessionName
FROM (
    SELECT 
        *,
        -- 按学生分组,每组内按学费降序给记录编号
        ROW_NUMBER() OVER (PARTITION BY StudentId ORDER BY TutionFee DESC) AS record_rank
    FROM TBLStudentFeeRecord
    WHERE StudentId = 1001 -- 替换为你要查询的学生ID
) sfr
-- 关联会话表获取会话名称
JOIN TBLSession ses ON sfr.SessionId = ses.SessionId
WHERE sfr.record_rank <= 2
-- 最终结果按学费降序排列
ORDER BY sfr.TutionFee DESC;

小提示:

如果存在多个相同最高学费的记录,想要把这些并列的记录都包含进来,可以把ROW_NUMBER()换成RANK(),这样并列的记录会得到相同的编号,不会被过滤掉。

方案二:排序限制法(适合不支持窗口函数的老版本数据库)

如果你的数据库不支持窗口函数(比如MySQL 5.x及以下),可以直接对指定学生的学费记录按降序排序,然后取前2条:

SELECT 
    sfr.StudentId,
    sfr.SessionId,
    sfr.TutionFee,
    ses.SessionName
FROM TBLStudentFeeRecord sfr
JOIN TBLSession ses ON sfr.SessionId = ses.SessionId
WHERE sfr.StudentId = 1001 -- 替换为你要查询的学生ID
ORDER BY sfr.TutionFee DESC
LIMIT 2;

局限性:

这个方法会直接取排序后的前2条记录,如果有并列的最高学费,只会返回其中一条,无法保留全部并列项。

验证结果

以上两种方案都能得到你期望的结果集:

StudentId SessionId TutionFee SessionName
1001 2 2000 2019-2020
1001 3 1000 2020-2021

内容的提问来源于stack exchange,提问作者sheikh muzammil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:42