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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:48:02