ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle开发 » 求一SQL,分组查询的。先谢谢大家。

标题: [原创] 求一SQL,分组查询的。先谢谢大家。
离线 chinaman189



精华贴数 0
个人空间 0
技术积分 109 (15507)
社区积分 64 (4319)
注册日期 2008-1-22
论坛徽章:0
      
      

发表于 2008-8-7 10:26 
求一SQL,分组查询的。先谢谢大家。

create table hw
(depid number,
dept varchar2(30),
amount number);

insert into hw
values(10,'北京',100);
insert into hw
values(10,'上海',200);
insert into hw
values(10,'南京',300);
insert into hw
values(20,'山东',400);
insert into hw
values(20,'河南',500);
insert into hw
values(20,'河北',600);
insert into hw
values(30,'湖南',700);
insert into hw
values(30,'浙江',800);
insert into hw
values(30,'陕西',900);
要求用sql查询每个分组中amount最大的前两条记录

depid      dept       amount                                            depid      dept       amount
10         上海        200                                                    10         南京        300
10         南京        300                                                    10         上海        200
20         河南        500                 或者 ===》                  20         河北        600
20         河北        600                                                    20         河南        500
30         浙江        800                                                    30         陕西        900
30         陕西        900                                                    30         浙江        800

请大家注意,depid 可能有很多,所以表中的记录也许不止现在的这么几条。
再次谢谢大家。


只看该作者    顶部
离线 junsansi
无名扫把


来自 bj
精华贴数 7
个人空间 9090
技术积分 8163 (153)
社区积分 677 (1177)
注册日期 2006-7-17
论坛徽章:66
现任管理团队成员2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:拳击2008北京奥运纪念徽章:游泳
      

发表于 2008-8-7 10:32 
这有何难:
PHP code:


SQL
select from hw;

 

     
DEPID DEPT                               AMOUNT

---------- ------------------------------ ----------

        
10 北京                                  100

        10 上海                                  200

        10 南京                                  300

        20 山东                                  400

        20 河南                                  500

        20 河北                                  600

        30 湖南                                  700

        30 浙江                                  800

        30 陕西                                  900

 

9 rows selected

 

SQL


SQLselect *

  
2    from (select t.*,

  
3                 row_number() over(partition by depid order by amount descrn

  4            from hw t
)

  
5   where rn 3

  6  
/

 

     
DEPID DEPT                               AMOUNT         RN

---------- ------------------------------ ---------- ----------

        
10 南京                                  300          1

        10 上海                                  200          2

        20 河北                                  600          1

        20 河南                                  500          2

        30 陕西                                  900          1

        30 浙江                                  800          2

 

6 rows selected

 

SQL


--




__________________
沉淀是一件很枯燥的事情,我要从沉淀中汲取营养,于枯燥中寻找乐趣,我没疯,你才是疯子,哇哈哈,哇哈哈哈哈~~
============================================
http://www.5ienet.com我爱我佳
扫地不过是我表面上的工作,我真正的身份其实是无名老僧------------------手里那根扫把~~~~
只看该作者    顶部
离线 stand32



精华贴数 0
个人空间 0
技术积分 25 (45964)
社区积分 0 (1766432)
注册日期 2008-5-2
论坛徽章:0
      
      

发表于 2008-8-7 10:44 
仅供参考:
SELECT x.depid,x.dept,x.amount FROM
  (SELECT ROWNUM listid,a.* FROM
    (SELECT * FROM hw ORDER BY depid,amount DESC) a
  ) x
  ,(SELECT depid,MIN(ROWNUM) listid FROM(
    SELECT ROWNUM,a.* FROM (
      SELECT * FROM hw a ORDER BY depid,amount DESC) a
      )
    GROUP BY depid
  ) y
WHERE x.depid=y.depid AND x.listid<=y.listid+1
  ORDER BY x.depid,x.amount;


只看该作者    顶部
离线 wangfans


精华贴数 3
个人空间 20
技术积分 6318 (209)
社区积分 6308 (237)
注册日期 2006-11-29
论坛徽章:69
现任管理团队成员金牌徽章奥运纪念徽章2008北京奥运纪念徽章:自行车2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:篮球
2008北京奥运纪念徽章:足球2008北京奥运纪念徽章:棒球每日论坛发贴之星体育版块博采纪念徽章2008年新春纪念徽章ITPUB新首页上线纪念徽章

发表于 2008-8-7 10:45 
用rank()over(),dense_rank()over() 和上面(2楼)那个人的分析函数都可以。


__________________
-------------------------------------------------
Life is always like this !
-------------------------------------------------
MSN: wangfans@163.com
-------------------------------------------------
只看该作者    顶部
离线 stand32



精华贴数 0
个人空间 0
技术积分 25 (45964)
社区积分 0 (1766432)
注册日期 2008-5-2
论坛徽章:0
      
      

发表于 2008-8-7 10:47 
junsansi好帅啊。


只看该作者    顶部
离线 stand32



精华贴数 0
个人空间 0
技术积分 25 (45964)
社区积分 0 (1766432)
注册日期 2008-5-2
论坛徽章:0
      
      

发表于 2008-8-7 10:50 
受教。


只看该作者    顶部
离线 wangfans


精华贴数 3
个人空间 20
技术积分 6318 (209)
社区积分 6308 (237)
注册日期 2006-11-29
论坛徽章:69
现任管理团队成员金牌徽章奥运纪念徽章2008北京奥运纪念徽章:自行车2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:篮球
2008北京奥运纪念徽章:足球2008北京奥运纪念徽章:棒球每日论坛发贴之星体育版块博采纪念徽章2008年新春纪念徽章ITPUB新首页上线纪念徽章

发表于 2008-8-7 10:51 


QUOTE:
原帖由 stand32 于 2008-8-7 10:44 发表
仅供参考:
SELECT x.depid,x.dept,x.amount FROM
  (SELECT ROWNUM listid,a.* FROM
    (SELECT * FROM hw ORDER BY depid,amount DESC) a
  ) x
  ,(SELECT depid,MIN(ROWNUM) listid FROM(
    SELECT ROWNUM,a.* FROM (
      SELECT * FROM hw a ORDER BY depid,amount DESC) a
      )
    GROUP BY depid
  ) y
WHERE x.depid=y.depid AND x.listid

这个对表进行全表扫描了两次,比三思兄的那段性能低了一倍左右。


__________________
-------------------------------------------------
Life is always like this !
-------------------------------------------------
MSN: wangfans@163.com
-------------------------------------------------
只看该作者    顶部
离线 stand32



精华贴数 0
个人空间 0
技术积分 25 (45964)
社区积分 0 (1766432)
注册日期 2008-5-2
论坛徽章:0
      
      

发表于 2008-8-7 10:53 
呵呵,我没有学过分析函数,只能拿我可以利用的知识处理了,不好意思。


只看该作者    顶部
离线 wyak47



精华贴数 0
个人空间 0
技术积分 233 (8367)
社区积分 0 (1660609)
注册日期 2007-12-18
论坛徽章:1
2008北京奥运纪念徽章:网球     
      

发表于 2008-8-7 11:05 


QUOTE:
原帖由 junsansi 于 2008-8-7 10:32 发表
这有何难:
PHP code:


SQL
select from hw;

 

     
DEPID DEPT                               AMOUNT

---------- ------------------------------ ----------

        
10 北京                                  100

        10 上海                                  200

        10 南京                                  300

        20 山东                                  400

        20 河南                                  500

        20 河北                                  600

        30 湖南                                  700

        30 浙江                                  800

        30 陕西                                  900

 

9 rows selected

 

SQL


SQLselect *

  
2    from (select t.*,

  
3                 row_number() over(partition by depid order by amount descrn

  4            from hw t
)

  
5   where rn 3

  6  
/

 

     
DEPID DEPT                               AMOUNT         RN

---------- ------------------------------ ---------- ----------

        
10 南京                                  300          1

        10 上海                                  200          2

        20 河北                                  600          1

        20 河南                                  500          2

        30 陕西                                  900          1

        30 浙江                                  800          2

 

6 rows selected

 

SQL


--



还是JUNSANSI的方法好


只看该作者    顶部
离线 sensilo
一般会员


精华贴数 1
个人空间 0
技术积分 486 (4013)
社区积分 19 (8035)
注册日期 2006-5-28
论坛徽章:1
2008北京奥运纪念徽章:田径     
      

发表于 2008-8-7 16:49 
select x.depid,x.dept,x.amount
    from (select t.*,
                 row_number() over(partition by depid order by amount desc) rn
              from zt t) x
    where rn < 3
DEPID DEPT                           AMOUNT
----- ------------------------------ ------
   10 南京                              300
   10 上海                              200
   20 河北                              600
   20 河南                              500
   30 陕西                              900
   30 浙江                              800
6 rows selected


__________________
i love this game
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问