Oracle 11选择最大的组

时间:2013-09-10 15:45:54

标签: oracle oracle11g

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

期望的结果:

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;

1 个答案:

答案 0 :(得分: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 BYORDER BY子句中使用列名别名。如果你有一个TRUNC - 编辑DATE在那里使用 - 你必须重复表达...

推荐阅读

Oracle Aggregate functions (11g R2)