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

