如何在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
相关产品推荐
相关产品推荐

