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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:22:45