【问题标题】:Oracle - Not a single-group group functionOracle - 不是单组组功能
【发布时间】:2025-12-28 01:50:06
【问题描述】:

对于下面的sql命令

select h.hacker_id
    ,h.name
    ,challenges_created
from hackers h
inner join (
    select hacker_id
        ,count(*) as challenges_created /* line 1 */
    from challenges
    group by hacker_id
    order by 2 desc
    ) tmp on h.hacker_id = tmp.hacker_id
order by challenges_created desc
    ,h.hacker_id;

到目前为止还不错,但是

一旦我尝试将max(count(*)) as maximum 添加到第 1 行,它就会给出错误:

不是单组群功能

这是它给出错误的代码:

select h.hacker_id
    ,h.name
    ,challenges_created
from hackers h
inner join (
    select hacker_id
        ,count(*) as challenges_created
        ,max(count(*)) as maximum
    from challenges
    group by hacker_id
    ) tmp on h.hacker_id = tmp.hacker_id
order by challenges_created desc
    ,h.hacker_id;

我基本上对获得最大计数感兴趣,即到目前为止challenges created 的最大数量。

我是 sql 新手,请提供帮助和义务。提前致谢。是的,当然!我知道最近有人问过很多这样的问题,但没有一个符合我的情况,这就是我再次问这个问题的原因。

【问题讨论】:

  • 请添加表结构,5-6 条记录作为示例数据和您在问题中期望的输出。
  • 当我在 SQL Server 中尝试此操作时,我收到错误 Cannot perform an aggregate function on an expression containing an aggregate or a subquery. 所以我认为这与您所看到的类似。我认为您必须添加另一个 Join 才能获得 Max(Count(*))
  • @WEI_DBA:在这个查询本身中不可能实现它吗?如果我可以在 sql 中使用像 top 这样的东西怎么办? oracle中也有类似top的东西吗?

标签: sql oracle count group-by max


【解决方案1】:

试试这个:

with x as (
  select h.hacker_id, h.name, count(*) challenges_created 
  from hackers h 
  inner join challenges on h.hacker_id = challenges.hacker_id
  group by h.hacker_id, h.name
)
select x.*, 
       (select max(challenges_created) from x) as "max"
from x
order by challenges_created desc, hacker_id;

【讨论】: