自关联和动态group by

网上看到一个开发面试题,我也拿来研究了一下。
表nba记录了nba(team  VARCHAR2(10),y NUMBER(4))夺冠球队的名称及年份
 
 
TEAM                 Y
-------------------- ------------------------------
活塞                 1990
公牛                 1991
公牛                 1992
公牛                 1993
火箭                 1994
火箭                 1995
公牛                 1996
公牛                 1997
公牛                 1998
请写出一条SQL语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少,结果如下: 
 
 
TEAM               B          E
------------------------------ --------------------------------
公牛                1991       1993
火箭                1994       1995
公牛                 1996       1998
写法如下:
select t.team, min(t.ay) as bg , max(t.ay)+1 as ed
  from (select b.team, a.y  as ay 
          from nba a, nba b
         where a.team = b.team
           and a.y = b.y - 1
           order by a.y) t        
 group by t.team,(t.ay-rownum)
分析:
1. 在t表里,把有连续夺冠的球队查询出来,包括球队,和年份,能取到开始,但是结束需要加1。
2.分组,排好序后,根据 (年份-rownum),因为是按年排序,又减去一个rownum,所以team一样的,年份减去rownum后,
年份-rownum也会一样。看样子,以后想分组不一样值的字段,减去某个变量,类似rownum,实现减去后的值一样,达到分组效果。
 
 
这个sql还是很巧妙的,拓展我的思维了。
 
 

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

转载于:http://blog.itpub.net/25027760/viewspace-1139759/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值