自關聯和動態group by

wenhual43發表於2014-04-10
網上看到一個開發面試題,我也拿來研究了一下。
表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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章