Oracle程序题之:夺冠球队

表 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) nn
GROUP 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) n2
ON
n1.team=n2.team
WHERE
n1.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) nn
GROUP BY (nn.y-ROWNUM)
ORDER BY Beginy;

查询结果

猜你喜欢

转载自blog.csdn.net/qq_41541619/article/details/80046351
今日推荐