ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 取分组的组内前三名

取分组的组内前三名

原创 Linux操作系统 作者:anchen211 时间:2009-06-17 23:06:40 0 删除 编辑

这是某公司一道面试题.比较典型,我发出我的做法,有其它做法的可以后面回贴.

create table myorders (area_id number,order_name   varchar2(5), cnt number);

insert into myorders values (1,'A1',1);
insert into myorders values (1,'A2',10);
insert into myorders values (1,'A2',3);
insert into myorders values (1,'A3',4);
insert into myorders values (1,'A4',5);

insert into myorders values (2,'B1',10);
insert into myorders values (2,'B1',44);
insert into myorders values (2,'B2',55);
insert into myorders values (2,'B2',5);
insert into myorders values (2,'B3',2);

insert into myorders values (3,'C1',444);
insert into myorders values (3,'C2',3);
insert into myorders values (3,'C3',6);
insert into myorders values (3,'C4',10);
insert into myorders values (3,'C5',88);

   
select *
  from (select rank() over(partition by m.area_id order by m.sumcnt desc) rk,
               m.*
          from (select area_id, order_name, sum(cnt) sumcnt
                  from myorders
                group by area_id, order_name) m) t   where t.rk <= 3;

返回结果集如下: 

       RK    AREA_ID ORDER_NAME     SUMCNT
---------- ---------- ---------- ----------
         1          1 A2                 13
         2          1 A4                  5
         3          1 A3                  4
         1          2 B2                 60
         2          2 B1                 54
         3          2 B3                  2
         1          3 C1                444
         2          3 C5                 88
         3          3 C4                 10

9 rows selected

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9375/viewspace-606636/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-11-04

  • 博文量
    129
  • 访问量
    197566