sql语句查找记录中的连续数据

用一条sql语句查找记录中的连续数据


背景

oracle作业有一道题:

用一条语句查出连续获得冠军的队伍,和其连续获胜的开始年B、结束年E

数据如下(表名NBA):

TEAMY
活塞1990
公牛1991
公牛1992
公牛1993
火箭1994
火箭1995
公牛1996
公牛1997
公牛1998
马刺1999
湖人2000
湖人2001
湖人2002
马刺2003
活塞2004
马刺2005
热火2006
马刺2007
凯尔特人2008
湖人2009
湖人20010

正确的结果集应该是酱紫的:

TEAMBE
公牛19911993
火箭19941995
公牛19961998
湖人20002002
湖人20092010

思路

既然要求一条语句,就不能用PL/SQL了
考虑先把TEAM和连续获胜的Y选出来,至于B和E,MIN和MAX就能选出来。
那么问题来了,怎么把TEAM和连续获胜的Y选出来

由于oracle内置表中有scott.emp这张表,就用这张表试刀,省得再创建一张表了。
以下sql语句的作用是选出scott.emp表中,同一个deptno,间隔为1150的连续的sal。

SELECT *
FROM scott.emp my_table2
-- 遍历scott.emp每一条记录,从中挑出满足以下条件的记录
WHERE exists(
-- 每个部门分一个组,若该部门内有my_table2.sal + 1150,说明my_table2.sal再间隔1150即有一条满足的记录
-- 因此my_table2.sal所在的记录要被选入
    SELECT my_table3.DEPTNO,my_table3.sal
    FROM scott.emp my_table3
    GROUP BY my_table3.DEPTNO,my_table3.sal
    HAVING my_table3.sal = my_table2.sal + 1150 AND my_table3.DEPTNO = my_table2.DEPTNO
)
-- 扫描结束,每个部门的最后一条合法sal都没有被纳入,因此加个union
UNION
SELECT *
FROM SCOTT.EMP
WHERE SCOTT.EMP.SAL IN (
-- 挑出每一个部门里被遗漏最后一个的合法sal
-- 其实就是上面select的结果每一组的最大值+1150,所以fromwhere是一模一样的
  SELECT max(SAL) + 1150
  FROM scott.emp my_table2
  WHERE exists(
      SELECT my_table3.DEPTNO,my_table3.sal
      FROM scott.emp my_table3
      GROUP BY my_table3.DEPTNO,my_table3.sal
      HAVING my_table3.sal = my_table2.sal + 1150 AND my_table3.DEPTNO = my_table2.DEPTNO
  )
  GROUP BY my_table2.DEPTNO
)

结果集如图
这里写图片描述


解决办法

上面已经把最重要的resolve了。回到开始的题目,使用以下sql语句应该就能搞定:

SELECT TEAM,min(Y) B,max(Y) E
FROM (
  SELECT *
  FROM NBA my_table2
  WHERE exists(
      SELECT my_table3.TEAM,my_table3.Y
      FROM NBA my_table3
      GROUP BY my_table3.TEAM,my_table3.Y
      HAVING my_table3.Y = my_table2.Y + 1 AND my_table3.TEAM = my_table2.TEAM
  )
  UNION
  SELECT *
  FROM NBA
  WHERE NBA.Y IN (
    SELECT max(Y) + 1
    FROM NBA my_table2
    WHERE exists(
        SELECT my_table3.TEAM,my_table3.Y
        FROM NBA my_table3
        GROUP BY my_table3.TEAM,my_table3.Y
        HAVING my_table3.Y = my_table2.Y + 1 AND my_table3.TEAM = my_table2.TEAM
    )
    GROUP BY my_table2.TEAM
  )
) my_table1
GROUP BY TEAM

吐槽

目前为止遇到过最烧脑的一个sql,想了一天,智商需要充值。

已标记关键词 清除标记
92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元   为什么学习数据分析?       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。    本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。   二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。   四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。   五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页