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

Oracle中不使用窗口函数(如row_number等)获取每组首行全属性的实现方法

在Oracle中不用窗口函数获取每组最大值行的方案

嘿,针对你这个需求——按id分组,取出每组里amount最大的完整行,还不能用row_number()这类窗口函数,我给你整理了两种实用的方法:

方法一:关联子查询匹配组内最大值

思路很直接:先找出每个id对应的最大amount,再把原表和这个结果关联,就能拿到对应的完整行数据了。代码如下:

SELECT t.id, t.amount
FROM your_table t
WHERE t.amount = (
    SELECT MAX(amount)
    FROM your_table
    WHERE id = t.id
);

要是你的数据里存在同一个id下有多行amount都是最大值的情况(比如同一个id有两行amount都是300),这个查询会返回所有符合条件的行。如果想确保每组只返回一行,哪怕有重复最大值,可以结合ROWNUM来限制:

SELECT t.id, t.amount
FROM your_table t
WHERE (t.id, t.amount) IN (
    SELECT id, MAX(amount)
    FROM your_table
    GROUP BY id
)
AND ROWNUM = 1;

方法二:用NOT EXISTS排除更大值

这个方法的逻辑是:找出那些在同一个id组里,没有其他行的amount比它更大的记录——说白了就是组内的最大值行。代码是这样的:

SELECT t.id, t.amount
FROM your_table t
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table t2
    WHERE t2.id = t.id
    AND t2.amount > t.amount
);

这个写法和第一种效果差不多,同样如果有重复最大值会返回所有对应行,要是需要每组仅一行,可以再根据实际情况调整。

测试你的示例数据

用你给的示例数据跑这两个查询,都会得到你想要的结果:

id amount
1 200
2 300
3 400

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:33:09