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

SQL行转同类型列:学生多学位数据重复行处理求助

解决学生数据因多学位重复的问题

别担心,第一次在论坛寻求SQL技术支持完全没问题,我来帮你梳理解决方案~

你提到的核心问题是:原本每个学生对应一行数据,关联学位表后,因为部分学生拥有多个学位,导致学生记录被重复输出。先把你给出的简化示例数据整理一下:

StudentID | CohortTerm  | DegreeYear | DegreeMonth
----------|-------------|------------|------------
1         | 2009 Spring | 2011       | 05
1         | 2009 Spring | 2012       | 08
2         | 2010 Fall   | 2013       | 05

针对这个问题,通常有两种常用的解决思路,你可以根据实际需求选择:

思路1:将多个学位信息合并到同一行

如果需要保留该学生的所有学位记录,但不想让学生行重复,可以把多个学位的年份和月份合并成一个字段输出。

MySQL 示例代码

SELECT 
    StudentID,
    CohortTerm,
    GROUP_CONCAT(CONCAT(DegreeYear, '-', DegreeMonth) SEPARATOR ', ') AS 所有学位信息
FROM 
    你的学生申请记录表名
GROUP BY 
    StudentID, CohortTerm;

SQL Server 示例代码

SELECT 
    StudentID,
    CohortTerm,
    STRING_AGG(CONCAT(DegreeYear, '-', DegreeMonth), ', ') AS 所有学位信息
FROM 
    你的学生申请记录表名
GROUP BY 
    StudentID, CohortTerm;

执行后,学生ID为1的记录会变成一行,学位信息显示为2011-05, 2012-08。

思路2:保留每个学生的单个学位记录(如最新/最早)

如果只需要每个学生的一条学位记录(比如取最新获得的学位),可以用窗口函数给每个学生的学位记录排序,然后筛选出排名第一的记录。

WITH 带排名的学位记录 AS (
    SELECT 
        *,
        ROW_NUMBER() OVER(PARTITION BY StudentID ORDER BY DegreeYear DESC, DegreeMonth DESC) AS 学位排名
    FROM 
        你的学生申请记录表名
)
SELECT 
    StudentID, CohortTerm, DegreeYear, DegreeMonth
FROM 
    带排名的学位记录
WHERE 
    学位排名 = 1;

这段代码会给每个学生的学位按年份降序、月份降序排名,取排名第一的就是最新的学位记录,这样每个学生只会输出一行数据。如果需要最早的学位,只需要把ORDER BY DegreeYear DESC, DegreeMonth DESC改成ORDER BY DegreeYear ASC, DegreeMonth ASC即可。

内容的提问来源于stack exchange,提问作者G.BOWLER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:28:00