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

如何在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最大值,对应你的样本数据结果如下:

idmax_repeat_cycle
15
41
80
159

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:17:44