1

我需要选择每个序列的最大动作,并列出每个序列的动作编号和序列号。

期望的结果:

Serial    Action
-----------------
 14       1201
 101      29   


create table listings(serial number(10), action number(10))

Insert into listings(serial, action)
Values ('14', '102');

Insert into listings(serial, action)
Values('14', '1201');

Insert into listings(serial, action)
Values('101', '28');

Insert into listings(serial, action)
Values('101', '29');

Insert into listings(serial, action)
Values('101', '22');

我认为这将返回所需的数据,但得到的不是单组组功能。几个变体放置 group by 子句都返回相同的错误:

select *
  from (select max(action),  
               serial
          from listings 
         order by 2 desc)
 where rownum < 2;
4

1 回答 1

2

如错误所述,您必须使用该GROUP BY子句...

select serial, max(action) 
from listings 
group by serial;

如果您只想获得前 2 名,按序列号排序:

select * from
  (select serial, max(action) as MAX_ACTION
  from listings 
  group by serial
  order by serial)
where ROWNUM <=2;

做什么GROUP BY

令人惊讶的是,它将结果分组在一起,并将聚合函数应用于组。这有一些限制:

  • 您只能在GROUP BY子句 中列出的结果中包含非聚合列
    • 即使它们对于每一行实际上都是唯一的
  • 我记得 Oracle 不允许在GROUP BYandORDER BY子句中使用列名别名。例如,如果您在其中使用TRUNC-ed DATE- 您必须重复表达式...

推荐阅读

Oracle 聚合函数 (11g R2)

于 2013-09-10T15:49:59.017 回答