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
相关产品推荐
相关产品推荐

