、表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
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
B,
E
FROM
(SELECT team,
rk,
MIN(y) b,
MAX(y) e
FROM
(SELECT team,
y,
y - row_number() over(partition BY team order by y ASC) rk
FROM nba
)
GROUP BY team,
rk
HAVING COUNT(1)>1
)
with t1 as
(
select '活塞' TEAM,1990 Y from dual union all
select '公牛' TEAM,1991 Y from dual union all
select '公牛' TEAM,1992 Y from dual union all
select '公牛' TEAM,1993 Y from dual union all
select '火箭' TEAM,1994 Y from dual union all
select '火箭' TEAM,1995 Y from dual union all
select '公牛' TEAM,1996 Y from dual union all
select '公牛' TEAM,1997 Y from dual union all
select '公牛' TEAM,1998 Y from dual union all
select '马刺' TEAM,1999 Y from dual union all
select '湖人' TEAM,2000 Y from dual
)
select TEAM,min(y) b,max(y) e
from
(
select TEAM,Y,
row_number() over (order by Y) - row_number() over (partition by TEAM order by Y) x from t1
)
group by TEAM,x
having count(*) > 1 TEAM B E
-----------------------------------
1 公牛 1991 1993
2 公牛 1996 1998
3 火箭 1994 1995
能不能再把这个再扩展下,假设非NBA的,年份可能不是连续的,中间有断的,又要得到连续年份的结果集。
你这种方法如何改写?
这边的核心思路就是判断年份是否连续,且等差为1
假设这里有数字 A,B,C,需要判断是否是连续的
可先将三个数字排序,假设这里从小到大顺序即为
序号 数字
1 A
2 B
3 C
如果这三个数字是连续的则,A-1,B-2,C-3则必定是相等的。
如数字 2,3,4但是如果是2,4,6,尽管是一组等差数列,但是与序号相减的值却是不等的。同样你也可以从大到小进行排序,然后 序号+数字
如
序号 数字
1 5
2 4
3 3
FROM (SELECT TEAM,
Y,
Y - RANK() OVER(PARTITION BY TEAM ORDER BY Y ASC) RK
FROM NBA)
GROUP BY TEAM, RK
HAVING COUNT(rk) > 1