如何从SQL表中获取各SectionName对应的最大SectionId
正确获取每个SectionName对应最大SectionId的SQL方案
问题背景
需求:从testTable(对应真实业务表SectionNomination)中查询每个SectionName对应的最大SectionId,每个SectionName仅保留一条记录。
表结构:SectionID是自增IDENTITY主键,SectionName为varchar类型。
原查询存在问题:无法返回正确的最大SectionId,且出现重复记录。
原查询错误分析
原查询的核心问题在于子查询的分组逻辑完全错误:
select max(SectionId) as pID from testTable group by SectionID
因为SectionID是主键,每个值唯一,按它分组后每组只有一条数据,max(SectionId)就是这条数据本身的ID,最终子查询会返回所有SectionID,关联后等同于直接查询全表,自然会出现重复记录,也完全没实现按SectionName分组取最大ID的需求。
正确实现方案
方案1:直接GROUP BY分组(最简洁)
直接按SectionName分组,取每组的最大SectionId,适合仅需这两个字段的场景:
SELECT SectionName, MAX(SectionId) AS MaxSectionId FROM testTable GROUP BY SectionName;
方案2:窗口函数ROW_NUMBER()(适合需要多字段场景)
如果需要查询testTable中的其他字段,使用窗口函数按SectionName分区、SectionId降序排序,取每个分区的第一条记录:
WITH RankedSections AS ( SELECT SectionName, SectionId, -- 按SectionName分组,SectionID降序排列,每个分组第一条为最大ID记录 ROW_NUMBER() OVER (PARTITION BY SectionName ORDER BY SectionId DESC) AS RowNum FROM testTable ) SELECT SectionName, SectionId FROM RankedSections WHERE RowNum = 1;
注:由于SectionID是主键,不会出现同SectionName下多个相同最大ID的情况,ROW_NUMBER()完全适用。
方案3:关联子查询(兼容旧版SQL)
如果使用的是不支持窗口函数的旧版SQL,可以用子查询先获取每个SectionName的最大SectionId,再关联原表:
SELECT t.SectionName, t.SectionId FROM testTable t INNER JOIN ( SELECT SectionName, MAX(SectionId) AS MaxSectionId FROM testTable GROUP BY SectionName ) sub ON t.SectionName = sub.SectionName AND t.SectionId = sub.MaxSectionId;
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

