SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

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

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

查询结果:

网上有这道题的出处及答案。详情请阅读原文跳转。

网上的参考答案是用PL/SQL求解的,这里我们用SQL Server看该如何求解。

具体代码如下:

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-RNDROP 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进行第二次分组来判断中间是否有间隔的年份。

这是一道很有意思的题目,小伙伴不妨自己动手尝试一下,兴许下次面试就考这样的题哦~

©著作权归作者所有:来自51CTO博客作者mb5fd8698f60f87的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 自学第七十天
  2. Android(安卓)年月选择器,基于必酷公司的竖直滑动选择器WheelView
  3. Android获取当前时间与星期几
  4. Android基于开源项目的WheelView的时间、地址联动选择对话框
  5. Android用Spinner做日期 年月日
  6. Android(安卓)短信列表的时间显示
  7. Android(安卓)自定义时间选择对话框
  8. Android 短信列表的时间显示
  9. Android String类型转换为float、double和int的工具类

随机推荐

  1. android卡片布局CardView
  2. Android高级知识—思维导图
  3. Android查看内存和CPU~
  4. Android获取 应用程序大小,数据大小,缓存大
  5. Android 实现 按钮从两边移到中间动画效
  6. android的KeyGuard
  7. Android(安卓)SDK更新后 ADT R17 E/Andro
  8. android xml 常用控件介绍
  9. android 创建动态创建菜单(钩子)
  10. android 开启本地相册选择图片并返回显示