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

如何编写SQL查询指定分区的第二高ID记录

获取指定Section中ID第二高的行解决方案

没问题,我来帮你搞定这个需求!针对你的[database]表结构,我提供几种不同的SQL写法,你可以根据自己使用的数据库类型选择合适的方案:

方法一:嵌套子查询排除最大值

这种方法逻辑直观,适合所有支持标准SQL的数据库:

SELECT * 
FROM [database] 
WHERE [ID] = (
    -- 找到section=1中比最大值小的最大ID,也就是第二高的ID
    SELECT MAX([ID]) 
    FROM [database] 
    WHERE [section] = 1 
    AND [ID] < (SELECT MAX([ID]) FROM [database] WHERE [section] = 1)
);

逻辑说明:先通过内层子查询拿到目标section的最高ID,再在同一个section里筛选出比这个最高ID小的最大数值,就是我们要的第二高ID,最后匹配整行数据。

方法二:排序+偏移量(适合MySQL/PostgreSQL等)

如果你的数据库支持LIMIT和OFFSET语法,这种写法更简洁:

SELECT * 
FROM [database] 
WHERE [section] = 1 
ORDER BY [ID] DESC  -- 按ID从高到低排序
LIMIT 1 OFFSET 1;   -- 跳过第1行(最高ID),取第2行

注意:如果目标section里只有1条或0条数据,这个查询会返回空结果。如果需要在这种场景下返回NULL,可以用COALESCE包装一下:

SELECT COALESCE(
    (SELECT * 
     FROM [database] 
     WHERE [section] = 1 
     ORDER BY [ID] DESC 
     LIMIT 1 OFFSET 1),
    NULL
) AS second_highest_row;

方法三:窗口函数(通用且扩展性强)

使用ROW_NUMBER()窗口函数的方法适配大多数现代数据库(比如SQL Server、Oracle、PostgreSQL等),而且如果以后要找第N高的ID,只需要修改序号即可:

SELECT *
FROM (
    -- 给每个section内的行按ID降序标上序号
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY [section] ORDER BY [ID] DESC) AS row_rank
    FROM [database]
) AS ranked_data
WHERE [section] = 1 AND row_rank = 2;

逻辑说明:先通过PARTITION BY [section]按分组,每个组内按ID降序排列并生成序号,最后筛选目标section中序号为2的行。

内容的提问来源于stack exchange,提问作者Lukáš Karpíšek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:50:06