如何在SQL中通过创建唯一键筛选仅选修单门课程的学生?
筛选仅选修单门选修课的学生学号
示例需求:获取仅选修单门选修课的学生学号(对应示例输出为符合条件的学生记录)
你不需要通过拼接列来实现这个需求,直接按roll_number分组统计选课数量,再筛选数量为1的即可。以下是两种可行的方案:
方案1:分组统计直接筛选
先按学号分组,统计每个学生的选修课数量,再通过HAVING子句筛选出仅选1门课的学生:
SELECT roll_number FROM student WHERE time BETWEEN '2023-03-12' AND '2023-03-13' GROUP BY roll_number HAVING COUNT(DISTINCT optional_subject) = 1;
注:如果同一个学生不会重复选同一门选修课,可以去掉
DISTINCT,简化为COUNT(optional_subject) = 1。
方案2:窗口函数保留选课信息
如果需要同时获取学生的学号和对应的选修课名称,可以用窗口函数先统计每个学生的选课总数,再筛选出总数为1的记录:
SELECT roll_number, optional_subject FROM ( SELECT roll_number, optional_subject, COUNT(optional_subject) OVER (PARTITION BY roll_number) AS subject_count FROM student WHERE time BETWEEN '2023-03-12' AND '2023-03-13' ) AS student_subjects WHERE subject_count = 1;
对原查询的说明
原查询中按roll_number和optional_subject分组、拼接列生成key的操作,无法帮你统计每个学生的总选课数,对于当前需求来说是多余的。直接通过分组统计或窗口函数就能高效实现筛选目标。
内容的提问来源于stack exchange,提问作者Farzam Ashhar
相关产品推荐
相关产品推荐

