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

Oracle SQL如何查询行数除以3取余对应的最后N行?

如何用简便的SELECT查询获取表的最后N行(N由总行数计算得出)

表结构与测试数据

CREATE TABLE "PIPPO" ("COLUMN1" number);
   
INSERT INTO PIPPO (COLUMN1) VALUES (1);
INSERT INTO PIPPO (COLUMN1) VALUES (2);
INSERT INTO PIPPO (COLUMN1) VALUES (3);
INSERT INTO PIPPO (COLUMN1) VALUES (4);
INSERT INTO PIPPO (COLUMN1) VALUES (5);
INSERT INTO PIPPO (COLUMN1) VALUES (6);
INSERT INTO PIPPO (COLUMN1) VALUES (7);
INSERT INTO PIPPO (COLUMN1) VALUES (8);

需求说明

需要编写SELECT语句,获取表PIPPO的最后N行,其中N的规则为:

  • N = 总行数 ÷ 3 的余数
  • 若余数为0,则N取3

示例场景

  1. 初始8条数据时,返回最后2行:
7
8
  1. 插入数据9后共9条,返回最后3行:
7
8
9
  1. 插入数据10后共10条,返回最后1行:
10

实现思路与SQL代码

核心思路

  1. 统计总行数:先计算表内总记录数,作为计算N的基础
  2. 确定N值:根据总行数计算N,处理余数为0的特殊情况(直接取3)
  3. 筛选最后N行:按数据插入顺序(这里假设COLUMN1值越大越晚插入)倒序排序,取前N行后再正序返回,匹配示例输出格式

具体实现(适用于Oracle、PostgreSQL等支持FETCH语法的数据库)

WITH total_rows AS (
    -- 统计总行数
    SELECT COUNT(*) AS cnt FROM PIPPO
),
calc_n AS (
    -- 计算N值
    SELECT CASE WHEN cnt % 3 = 0 THEN 3 ELSE cnt % 3 END AS n FROM total_rows
)
-- 取最后N行并正序输出
SELECT COLUMN1
FROM PIPPO
ORDER BY COLUMN1 DESC
FETCH NEXT (SELECT n FROM calc_n) ROWS ONLY
ORDER BY COLUMN1 ASC;

兼容更多数据库的实现(用窗口函数)

如果数据库不支持FETCH NEXT,可以用ROW_NUMBER()窗口函数标记行号:

WITH total_rows AS (
    SELECT COUNT(*) AS cnt FROM PIPPO
),
ranked_data AS (
    -- 按COLUMN1倒序标记行号,行号1对应最新数据
    SELECT COLUMN1,
           ROW_NUMBER() OVER (ORDER BY COLUMN1 DESC) AS rn
    FROM PIPPO
)
SELECT COLUMN1
FROM ranked_data, total_rows
-- 筛选行号小于等于N的记录
WHERE rn <= CASE WHEN cnt % 3 = 0 THEN 3 ELSE cnt % 3 END
ORDER BY COLUMN1 ASC;

注意事项

上述代码假设COLUMN1的值能代表数据的插入顺序(后插入的数值更大),如果表中有专门的自增主键或创建时间戳,应该用该列进行排序,确保取到的是真正最后插入的行。


内容的提问来源于stack exchange,提问作者Falco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17