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
示例场景
- 初始8条数据时,返回最后2行:
7 8
- 插入数据9后共9条,返回最后3行:
7 8 9
- 插入数据10后共10条,返回最后1行:
10
实现思路与SQL代码
核心思路
- 统计总行数:先计算表内总记录数,作为计算N的基础
- 确定N值:根据总行数计算N,处理余数为0的特殊情况(直接取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
相关产品推荐
相关产品推荐

