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

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

[[414963]]

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

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

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

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

查询结果:

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

问题分析

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

具体代码如下:

  1. CREATE TABLE  #t(TEAM varchar(20), Y int
  2. INSERT #t(TEAM,Y)  VALUES 
  3. ('活塞',1990), 
  4. ('公牛',1991), 
  5. ('公牛',1992), 
  6. ('公牛',1993), 
  7. ('火箭',1994), 
  8. ('火箭',1995), 
  9. ('公牛',1996), 
  10. ('公牛',1997), 
  11. ('公牛',1998), 
  12. ('马刺',1999), 
  13. ('湖人',2000), 
  14. ('湖人',2001), 
  15. ('湖人',2002), 
  16. ('马刺',2003), 
  17. ('活塞',2004), 
  18. ('马刺',2005), 
  19. ('热火',2006), 
  20. ('马刺',2007), 
  21. ('凯尔特人',2008), 
  22. ('湖人',2009), 
  23. ('湖人',2010); 
  24.  
  25. SELECT RN=IDENTITY(INT),* INTO #a FROM #t ORDER BY TEAM,Y 
  26.  
  27.    SELECT a.TEAM, 
  28.    MIN(a.Y) B, 
  29.    MAX(a.Y) E 
  30.    FROM #a a 
  31.    WHERE EXISTS( 
  32.      SELECT 1 FROM #a 
  33.      WHERE TEAM=a.TEAM 
  34.      AND (Y=a.Y-1 OR a.Y=Y-1) 
  35.    ) 
  36.    GROUP BY a.TEAM,Y-RN 
  37.  
  38. DROP TABLE #t,#a 

解答的结果如下:

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

首先是给这些数据添加一列自增长的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-09-26 17:14:23

SQL查询

2011-05-17 13:22:50

SQL对象名无效

2010-06-11 16:33:21

openSUSE fl

2009-04-23 09:11:49

职场IT人求职

2018-09-20 11:54:31

数据库MySQL性能优化

2011-12-19 14:22:36

云计算虚拟化

2011-04-25 14:51:24

2010-09-24 15:46:23

SQL查询

2017-07-26 21:54:59

2017-05-22 15:23:46

PUE监测数据中心

2010-08-31 08:38:55

SQL Server

2009-07-22 13:32:24

JDBC SQL
点赞
收藏

51CTO技术栈公众号