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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:06:03