SQL如何求解连续年份的问题?

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

[[414963]]

本文转载自微信公众号「SQL数据库开发」,作者丶平凡世界。转载本文请联系SQL数据库开发公众号。

最近看到这样一道题目,觉得挺有意思,给小伙伴们分享一下解题思路。

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

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

查询结果:

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

问题分析

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

具体代码如下:

CREATE TABLE  #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 ORDER BY TEAM,Y 
 
   SELECT a.TEAM, 
   MIN(a.Y) B, 
   MAX(a.Y) E 
   FROM #a a 
   WHERE EXISTS( 
     SELECT 1 FROM #a 
     WHERE TEAM=a.TEAM 
     AND (Y=a.Y-1 OR a.Y=Y-1) 
   ) 
   GROUP BY a.TEAM,Y-RN 
 
DROP TABLE #t,#a 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

解答的结果如下:

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

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

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

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

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

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

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

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

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

 

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

 

责任编辑:武晓燕 来源: SQL数据库开发
相关推荐

2023-11-02 08:38:49

递归SQL用法

2021-04-06 11:50:30

SQL数据统计

2021-11-03 16:00:40

SQL流量序号

2021-01-05 08:12:42

SQL日期Spt

2010-06-11 09:13:20

openSUSE 网卡

2010-06-11 13:05:41

openSUSE视频

2010-06-09 13:03:00

Opensuse分区

2010-06-11 16:33:21

openSUSE fl

2011-05-17 13:22:50

SQL对象名无效

2010-09-26 17:14:23

SQL查询

2009-04-23 09:11:49

职场IT人求职

2018-09-20 11:54:31

数据库MySQL性能优化

2011-12-19 14:22:36

云计算虚拟化

2010-09-24 15:46:23

SQL查询

2011-04-25 14:51:24

2017-07-26 21:54:59

2017-05-22 15:23:46

PUE监测数据中心

2021-11-09 06:55:03

SQLServer排序

2010-09-25 10:05:25

sql server主
点赞
收藏

51CTO技术栈公众号