SQL如何求解连续性的问题?

简介: SQL数据库开发

有这样一道题目

下表记录了夺冠球队的名称及年份:

60.jpg

请写出一条 SQL 语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少?

查询结果:


61.jpg


之前我们有讲解如何求解连续多少天的问题,这个题有点类似,但是也有点不一样的地方。


问题分析

一般连续性的问题,我们都需要使用笛卡尔积进行错位匹配,就是类似a.ID=b.ID+1的这种。这一题我们也可以使用类似的方法。


具体代码如下:

CREATETABLE  #t(TEAM varchar(20), Y int)
INSERT #t(TEAM,Y)  VALUES
('活塞',1990),
('公牛',1991),
('公牛',1992),
('公牛',1993),
('火箭',1994),
('火箭',1995),
('公牛',1996),
('公牛',1997),
('公牛',1998),
('马刺',1999),
('湖人',2000),
('湖人',2001),
('湖人',2002),
('马刺',2003),
('活塞',2004),
('马刺',2005),
('热火',2006),
('马刺',2007),
('凯尔特人',2008),
('湖人',2009),
('湖人',2010);

SELECT RN=IDENTITY(INT),* INTO #a FROM #t ORDERBY TEAM,Y

  SELECT a.TEAM,
  MIN(a.Y) B,
  MAX(a.Y) E
  FROM #a a
  WHEREEXISTS(
    SELECT1FROM #a
    WHERE TEAM=a.TEAM
    AND (Y=a.Y-1OR a.Y=Y-1)
  )
  GROUPBY a.TEAM,Y-RN

DROPTABLE #t,#a

解答的结果如下:



62.jpg

我们对上面的解法进行解读一下:

首先是给这些数据添加一列自增长的RN列并插入到新的临时表#a并且对TEAM和Y排序。

其次是将#a进行自匹配,匹配的条件是TEAM名称相同(TEAM=a.TEAM),并且年份Y与前后的年份进行匹配(Y=a.Y-1 OR a.Y=Y-1)。

这个匹配是精妙地方之一,这样就可以判定该球队前后几年的年份是否连续的。

如果球队名相同的前提下,年份连续,就满足这个条件;

如果年份连续,但是球队名不相同,就不满足这个条件了。

最后在进行分组的时候,不仅对球队TEAM进行了分组,而且还对Y-RN进行了分组。为什么要对Y-RN进行分组呢?

如果去掉这个条件,我们发现如下情形:



63.jpg

公牛和湖人中间间隔了几年才重新连续夺冠,但是这里因为没有对Y-RN进行分组,导致这个球队和夺冠年份在进行匹配时都满足了。因为#a表中的内容实际上是这样的,

64.jpg

Y=a.Y-1 OR a.Y=Y-1只要有一个满足即可判断是连续的年份,实际上经过我们处理后确实满足上述条件,所以需要加上Y-RN进行第二次分组来判断中间是否有间隔的年份。因为如果有间隔,那么Y-RN就不是同一个值了。



相关文章
|
2月前
|
SQL 算法 大数据
为什么大数据平台会回归SQL
在大数据领域,尽管非结构化数据占据了大数据平台80%以上的存储空间,结构化数据分析依然是核心任务。SQL因其广泛的应用基础和易于上手的特点成为大数据处理的主要语言,各大厂商纷纷支持SQL以提高市场竞争力。然而,SQL在处理复杂计算时表现出的性能和开发效率低下问题日益凸显,如难以充分利用现代硬件能力、复杂SQL优化困难等。为了解决这些问题,出现了像SPL这样的开源计算引擎,它通过提供更高效的开发体验和计算性能,以及对多种数据源的支持,为大数据处理带来了新的解决方案。
|
2月前
|
SQL 数据库
如何应用SQL约束条件?
【10月更文挑战第28天】如何应用SQL约束条件?
88 11
|
2月前
|
SQL 存储 Oracle
sql约束条件
【10月更文挑战第28天】sql约束条件
50 8
|
SQL Oracle 关系型数据库
Oracle数仓中判断时间连续性的几种SQL写法
零、需求介绍 现有一张表数据如下: 此表是一张镜像表,policyno列代表一个保单号,state列代表这个保单号在snapdate当天的最后一次状态(state每天可能会变很多次,镜像表只保留snapdate时间点凌晨的最后一次状态), snapdate代表当天做镜像的时间,现在有个需求,我们想取出来这个保单号连续保持某个状态的起止时间,例如: 保单号sm1保持状态1的起止时间为2021020120210202,然后在20210203时候变成了状态2,又在20210204时候变成了状态3,最终又在202
Oracle数仓中判断时间连续性的几种SQL写法
|
SQL 存储 运维
SQL:优化问题&并发问题
SQL:优化问题&并发问题
|
SQL 数据挖掘 Python
SQL练习:这个sql写的妙啊!1(较难)+1(中等)+1(困难)
SQL练习:这个sql写的妙啊!1(较难)+1(中等)+1(困难)
145 0
SQL练习:这个sql写的妙啊!1(较难)+1(中等)+1(困难)
|
存储 SQL 缓存
提高数据库的查询速率及其sql语句的优化问题
提高数据库的查询速率及其sql语句的优化问题
185 0
|
SQL 存储 数据库
一个反直觉的sql
一个反直觉的sql
一个反直觉的sql