Oracle中Group By结合Offset和Fetch Rows Only使用报错求助
问题分析与解决方案
你的查询报错的核心原因是:ORDER BY子句引用了transaction_date,但该字段既没有出现在SELECT列表、GROUP BY子句中,也没有被聚合函数处理。GROUP BY执行后,原始数据行已被合并,无法直接引用未处理的原始字段进行排序。
根据你的需求,分两种场景给出解决方案:
场景1:先分页取特定行,再对这些行求和
如果你的逻辑是「先按transaction_date倒序,跳过前12行取接下来的12行,再对这部分行的amount求和」,需要先完成排序分页,再做聚合:
SELECT SUM(amount), column1 FROM ( -- 先筛选并分页目标行 SELECT amount, column1 FROM table1 WHERE column1 = '000000000' AND column2 = 0 ORDER BY transaction_date DESC OFFSET 12 ROWS FETCH NEXT 12 ROWS ONLY ) AS filtered_rows GROUP BY column1;
场景2:先分组求和,再对分组结果分页(此场景对你的查询无实际意义)
如果你的逻辑是「先对所有符合条件的数据分组求和,再对分组结果排序分页」,需要将transaction_date通过聚合函数处理后再用于排序。但注意你的column1是固定值000000000,分组后只会得到1条结果,OFFSET和FETCH不会产生实际效果:
SELECT SUM(amount), column1, MAX(transaction_date) AS max_trans_date FROM table1 WHERE column1 = '000000000' AND column2 = 0 GROUP BY column1 ORDER BY max_trans_date DESC OFFSET 12 ROWS FETCH NEXT 12 ROWS ONLY;
关键说明
SQL的执行顺序是:WHERE → GROUP BY → SELECT → ORDER BY → OFFSET/FETCH。因此ORDER BY只能引用GROUP BY处理后存在的字段,要么是GROUP BY的分组字段,要么是通过聚合函数生成的字段。
内容的提问来源于stack exchange,提问作者MuhammedF
相关产品推荐
相关产品推荐

