如何在SQL中仅对subCode列去重并查询所有列
正确实现按subCode去重并返回所有列的SQL方案
问题原因
你之前用的SELECT DISTINCT subCode, Title, grade, section FROM TABLENAME达不到预期,是因为DISTINCT是对所有选中列的组合做去重,不是只针对subCode。只要section这类列的值不同,整行就会被判定为不同,所以会返回全部5行数据。
从你的预期结果来看,需要对每个唯一的subCode,返回任意一行对应的其他列数据(比如每个subCode取第一行),以下是两种可行的实现方式:
方案1:窗口函数(推荐,兼容多数现代数据库)
用ROW_NUMBER()窗口函数按subCode分组编号,只保留每组的第一行:
SELECT subCode, Title, grade, section FROM ( SELECT subCode, Title, grade, section, ROW_NUMBER() OVER (PARTITION BY subCode ORDER BY section) AS rn FROM TABLENAME ) t WHERE rn = 1;
- 说明:
PARTITION BY subCode按科目编码分组,ORDER BY section决定每组内取哪一行(这里取section排序后的第一行,你可以根据需求改成其他排序规则,比如ORDER BY grade DESC)。如果不需要特定顺序,部分数据库支持省略ORDER BY。
方案2:GROUP BY结合聚合函数
如果你的数据库不支持窗口函数,可通过GROUP BY配合聚合函数,对每个subCode取其他列的对应值:
SELECT subCode, MAX(Title) AS Title, MAX(grade) AS grade, MAX(section) AS section FROM TABLENAME GROUP BY subCode;
- 说明:同一
subCode对应的Title和grade值一致,用MAX()/MIN()都能得到正确结果;section会取分组内最大的那个,和你的预期结果匹配。
执行结果
运行上述任意语句,都会得到你想要的结果:
| subCode | Title | grade | section |
|---|---|---|---|
| 045/01 | Math | 12 | Grade 12.D |
| 011/01 | Science | 12 | Grade 12.D |
内容的提问来源于stack exchange,提问作者Haya
相关产品推荐
相关产品推荐

