、表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
解决方案 »
- 在使用spotlight on oracle時報錯無法使用連接DB
- 关于一个基于多张表创建视图的问题,望高人赐教!
- 关于ORACLE中递归语句的问题?
- 请问Oracle的问题???
- 在ORACLE中怎么更改字段名?
- 关于如何扩展BLOB字段的系统索引
- SQL语句!请高手回答
- 有谁知道数据库管理工具TOAD等软件下载地址
- 云端数据库使用Oracle好还是MySQL好
- mysql储存过程怎么装换成oracle的储存过程。。。。
- Oracle Data Access Components for Oracle Server 11.2.0.3.0只能安装在现有 Oracle Databas
- oracle 11g 安装不上
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