Oracle数据库按order_no分组取每组最大seq_no对应最新记录咨询
Oracle 按order_no分组取最大seq_no对应整行记录实现方案
原SQL错误原因
- 聚合函数
max()不能直接写在WHERE子句中,WHERE仅用于原始行记录的过滤,不支持聚合逻辑计算 - 子查询执行
GROUP BY order_no后,id字段既没有出现在聚合函数中,也没有加入GROUP BY列表,不符合Oracle的GROUP BY语法约束
推荐实现方案
方案1:窗口函数(Oracle 11g及以上版本优先使用,性能最优)
通过ROW_NUMBER()窗口函数按order_no分组,分组内按seq_no倒序排序,取每个分组排序第一的记录即可:
SELECT id, order_no, seq_no, status FROM ( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY order_no ORDER BY seq_no DESC) rn FROM order_status t ) WHERE rn = 1;
若业务允许同一个order_no存在多条相同最大seq_no的记录,且需要全部取出,可将
ROW_NUMBER()替换为RANK()。
方案2:关联子查询(兼容性好,所有Oracle版本均支持)
通过关联子查询匹配每个order_no对应的最大seq_no:
SELECT t1.* FROM order_status t1 WHERE t1.seq_no = ( SELECT MAX(seq_no) FROM order_status t2 WHERE t2.order_no = t1.order_no );
方案3:预分组关联查询
先分组查询得到每个order_no的最大seq_no,再关联原表拿到完整行记录:
SELECT t1.* FROM order_status t1 INNER JOIN ( SELECT order_no, MAX(seq_no) AS max_seq FROM order_status GROUP BY order_no ) t2 ON t1.order_no = t2.order_no AND t1.seq_no = t2.max_seq;
内容的提问来源于stack exchange,提问作者AppleT
相关产品推荐
相关产品推荐

