本文共 1199 字,大约阅读时间需要 3 分钟。
表 nba 记录了 nba(team VARCHAR2(10),y NUMBER(4))夺冠球队的名称及年份:
TEAM Y
-------------------------
活塞 1990
公牛 1991
公牛 1992
公牛 1993
火箭 1994
火箭 1995
公牛 1996
公牛 1997
公牛 1998
马刺 1999
湖人 2000
湖人 2001
湖人 2002
马刺 2003
活塞 2004
马刺 2005
热火 2006
马刺 2007
凯尔特人 2008
湖人 2009
湖人 2010
请写出一条 SQL 语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少,
结果如下:
TEAM B E
------------------------------ ---------
公牛 1991 1993
火箭 1994 1995
公牛 1996 1998
湖人 2000 2002
湖人 2009 2010
答案:
SELECT MAX(nn.team) team,MIN(nn.y) Beginy,MAX(nn.y)+1 Endy FROM (SELECT n2.team,n2.y,ROWNUM,n2.y-ROWNUM FROM (SELECT * FROM nba) n1 INNER JOIN (SELECT * FROM nba) n2 ON n1.team=n2.team WHERE n1.y=n2.y+1) nnGROUP BY (nn.y-ROWNUM)ORDER BY Beginy;
1.通过自身查询,查询出连续两年获奖的球队,为了方便理解,添加了两个伪列,用于表示行号和球队开始获奖的年份
SELECT n2.team,n2.y,ROWNUM,n2.y-ROWNUM FROM (SELECT * FROM nba) n1 INNER JOIN (SELECT * FROM nba) n2ONn1.team=n2.teamWHEREn1.y=n2.y+1
查询结果
2.将上面的结果作为子查询,按开始获奖年份进行排序,最后连续获奖的一年为MAX(nn.y)+1
SELECT MAX(nn.team) team,MIN(nn.y) Beginy,MAX(nn.y)+1 Endy FROM (SELECT n2.team,n2.y,ROWNUM,n2.y-ROWNUM FROM (SELECT * FROM nba) n1 INNER JOIN (SELECT * FROM nba) n2 ON n1.team=n2.team WHERE n1.y=n2.y+1) nnGROUP BY (nn.y-ROWNUM)ORDER BY Beginy;
查询结果