Oracle中如何正确查询学生的起始/最小学期?SQL实现相关问题
问题原因
你当前编写的SQL存在两个核心问题,导致无法正确获取每名学生的最小学期:
- GROUP BY子句包含了
sem_code、degree_code字段,分组粒度为「学生+学期+学位」的组合,计算出的min(startsem)仅为该组合内的最小值,不是单个学生全局的最小入学学期 - SELECT列表中引用了
admdate字段,但该字段未出现在GROUP BY子句中,在开启严格校验模式的数据库中会直接执行报错
调整后的SQL写法
写法1:子查询关联法(兼容所有SQL数据库)
先通过子查询计算出每名学生的最小入学学期,再关联回原表获取对应完整记录:
SELECT t.stdcode, t.altcode, t.name, t.admdate, t.sem_code, t.startsem FROM V_ALLSTUDATAAA t INNER JOIN ( SELECT stdcode, MIN(startsem) AS min_startsem FROM V_ALLSTUDATAAA GROUP BY stdcode ) t_min ON t.stdcode = t_min.stdcode AND t.startsem = t_min.min_startsem ORDER BY t.altcode;
写法2:窗口函数法(适配支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、Oracle等)
通过开窗按学生分组排序,直接取每个学生排序第一的记录:
SELECT stdcode, altcode, name, admdate, sem_code, startsem FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY stdcode ORDER BY startsem ASC) AS rn FROM V_ALLSTUDATAAA ) t WHERE rn = 1 ORDER BY altcode;
如果同一名学生存在多条同一最小入学学期的记录需要全部保留,将ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Secular Earth
相关产品推荐
相关产品推荐

