如何在Oracle中用SQL查询获取每个非唯一id的最大repeat_cycle值?
解决每个ID获取repeat_cycle最大值的SQL问题
我来帮你搞定这个需求!你想要给每个非唯一的id,拿到对应的repeat_cycle字段的最大值,先拆解下你现有SQL的问题,再给你几个靠谱的解决方案。
你的SQL错误分析
你写的这段SQL:
SELECT * FROM ( SELECT id, date, repeat_cycle FROM table t1 order by repeat_cycle desc ) t1 and rownum=1;
有两个核心问题:
- 语法错误:子查询别名
t1后面不能直接跟and rownum=1,正确的条件写法应该放在WHERE子句里。 - 逻辑错误:就算修正语法,
rownum=1也只能返回整个排序后结果集的第一行,没法实现按id分组取每个组内最大值的需求。
可行的解决方案
方案1:用GROUP BY + MAX聚合函数(最简版,仅需id和最大值)
如果只需要每个id对应的最大repeat_cycle值,这个方法最直接:
SELECT id, MAX(repeat_cycle) AS max_repeat_cycle FROM your_table_name -- 记得把这里换成你的实际表名 GROUP BY id ORDER BY id;
执行后会得到每个id和它的repeat_cycle最大值,对应你的样本数据结果如下:
| id | max_repeat_cycle |
|---|---|
| 1 | 5 |
| 4 | 1 |
| 8 | 0 |
| 15 | 9 |
方案2:用窗口函数(保留整行数据,推荐)
如果你需要同时保留date字段,或者要处理同一个id有多个行repeat_cycle等于最大值的情况,窗口函数是更好的选择:
2.1 只取每个id的一条最大值行(如果有多个相同最大值,随机取一条)
用ROW_NUMBER()给每个id组内的行按repeat_cycle降序排序,然后取排序后第一行:
SELECT id, date, repeat_cycle FROM ( SELECT id, date, repeat_cycle, -- 按id分组,组内按repeat_cycle降序排,给每行标记序号 ROW_NUMBER() OVER (PARTITION BY id ORDER BY repeat_cycle DESC) AS row_num FROM your_table_name ) ranked_data WHERE row_num = 1;
2.2 保留所有repeat_cycle等于最大值的行
如果同一个id有多个行的repeat_cycle都是最大值,用RANK()可以保留这些行:
SELECT id, date, repeat_cycle FROM ( SELECT id, date, repeat_cycle, -- 相同最大值的行会得到相同的排名 RANK() OVER (PARTITION BY id ORDER BY repeat_cycle DESC) AS rank_num FROM your_table_name ) ranked_data WHERE rank_num = 1;
内容的提问来源于stack exchange,提问作者Cesc
相关产品推荐
相关产品推荐

