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就不是同一个值了。



相关文章
|
数据采集 算法 前端开发
一线大厂互联网校招居然还有潜规则!
现在的一线互联网校招考的是造航母的题,做的却是修零件的话,面试点时候造火箭,入职让我拧螺丝,小编的真的是无力吐槽,动辄20K的月薪吸引了太多同学尝试头部公司的校招,部分职位的投递人数与招聘人数比超过500:1。而常考的笔试和面试题已经被摸透了,只能往深度和广度去扩展,也就是增加难度筛掉50%-90%的人。
343 0
|
SQL 存储 关系型数据库
HarmonyOS学习路之开发篇—数据管理(关系型数据库)
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。HarmonyOS提供的关系型数据库功能更加完善,查询效率更加高效。
|
机器学习/深度学习 算法 数据可视化
如何选择正确的机器学习模型?
【5月更文挑战第4天】如何选择正确的机器学习模型?
395 4
|
SQL 监控 关系型数据库
mysql统计数据库大小
通过这些方法,数据库管理员可以有效地监控和规划MySQL数据库的存储需求,确保数据库的稳定运行。
571 3
|
小程序 JavaScript API
小程序实现分享的三种方法
【8月更文挑战第20天】
|
前端开发 JavaScript Java
现代软件开发中的跨平台技术探索与应用
本文探讨了现代软件开发中跨平台技术的发展与应用。从不同编程语言及框架的角度出发,分析了如何利用跨平台技术优化开发流程、提高代码复用性,并展望了未来跨平台技术的发展趋势。
|
安全 数据挖掘 Java
C++ 完美转发深度解析:从入门到精通
C++ 完美转发深度解析:从入门到精通
936 1
|
存储 编译器 程序员
int 和 long 的区别
int 和 long 的区别
|
Ubuntu Linux 数据安全/隐私保护
Linux(7)Ubuntu20.04 arm64安装Docker
Linux(7)Ubuntu20.04 arm64安装Docker
2011 0
|
消息中间件 NoSQL 算法
第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经
简单来说,就如标题一样,我今天也想要凡尔赛一次,原来大厂的面试也没有想象中的那么难,字节跳动3面+腾讯6面,就这么一次性过了,下面就细细聊聊我的大厂面经吧,希望能够给金三银四要面试的朋友提供一些经验。