实例1:测试数据:

create table nba(

team   varchar2(20),

year number(4)

)

SQL> select * from nba;

TEAM                  YEAR

-------------------- -----

活塞                  1990

公牛                  1991

公牛                  1992

公牛                  1993

火箭                  1994

火箭                  1995

公牛                  1996

公牛                  1997

公牛                  1998

马刺                  1999

湖人                  2000

湖人                  2001

湖人                  2002

马刺                  2003

活塞                  2004

马刺                  2005

热火                  2006

马刺                  2007

凯尔特人              2008

湖人                  2009

湖人                  2010

21 rows selected

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

TEAM BEGIN END
---------------
公牛 1991 1993
火箭 1994 1995
公牛 1996 1998
湖人 2000 2002
湖人 2009 2010

求解:

SQL> select team, min(t2y), max(t1y)

2    from (select t2.team, t2.year as t2y, t1.year as t1y

3            from nba t1, nba t2

4           where t1.team = t2.team

5             and t1.year = (t2.year + 1)) t

6   group by t.team, (t.t1y - rownum);

TEAM                   MIN(T2Y)   MAX(T1Y)

-------------------- ---------- ----------

公牛                       1996       1998

湖人                       2009       2010

湖人                       2000       2002

公牛                       1991       1993

火箭                       1994       1995

分析:这个SQL要做的有两件事:

1)求出连续获得冠军的team

2)求出起止年份

关系:根据分析1可知,存在关系team相同的球队(year=year+1),满足这个关系的球队即是连续获得冠军的球队。可以得到SQL如下:

SQL> select t2.team, t2.year as t2y, t1.year as t1y

2    from nba t1, nba t2

3   where t1.team = t2.team

4     and t1.year = (t2.year + 1);

TEAM                   T2Y   T1Y

-------------------- ----- -----

公牛                  1991  1992

公牛                  1992  1993

火箭                  1994  1995

公牛                  1996  1997

公牛                  1997  1998

湖人                  2000  2001

湖人                  2001  2002

湖人                  2009  2010

8 rows selected

sql中t2y字段表示球队获得冠军每连续两行之间的最小年份,t1y为连续两行记录间的最大年份,最终满足分析1,和2的结果集到此都可以从这个临时表中取得了。

下面我们需要对这个临时表做一个分组,即连续获得冠军的球队我们只需要1行记录用做显示,分组字段是什么呢?观察临时表结构,这里我们采用(team,t1y-rownum)作为分组条件,这样连续获得冠军的球队team就可以用一行显示了。那么我们还差起止年份需要处理一下,就可以出具最终的查询结果了!从临时表结构可以看出通过(team,t1y-rownum)分组后,可以由t2y字段我们求出开始年份,即(min(t2y)),可以由t1y字段求出结止年份,即(max(t1y))!继续处理SQL如下:

SQL> select t.team, min(t2y), max(t1y)

2    from (select t2.team, t2.year as t2y, t1.year as t1y

3            from nba t1, nba t2

4           where t1.team = t2.team

5             and t1.year = (t2.year + 1)) t

6   group by t.team, t1y - rownum

7   order by min(t2y);

TEAM                   MIN(T2Y)   MAX(T1Y)

-------------------- ---------- ----------

公牛                       1991       1993

火箭                       1994       1995

公牛                       1996       1998

湖人                       2000       2002

湖人                       2009       2010

总结一下,对于这套面试题,对于DBA出身的我,没有处理过类似问题,如果是我遇到了,估计在纸上是写不出来,但是自己处理,是可以求出如上结果的。所以写SQL是一个循序渐进的过程,不是一蹴而就的结果。

Oracle的一些经典SQL面试题的更多相关文章

  1. 经典SQL面试题(转)

    以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...

  2. 经典SQL面试题(转)

    http://www.cnblogs.com/kcher90/archive/2013/03/13/2957932.html 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录 ...

  3. 经典sql面试题(学生表_课程表_成绩表_教师表)

    转载:https://www.cnblogs.com/qixuejia/p/3637735.html 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna ...

  4. [转帖]分享Oracle的四道经典面试题,值得收藏

    分享Oracle的四道经典面试题,值得收藏 原创 波波说运维 2019-07-20 00:02:00 https://www.toutiao.com/i6713901660919300621/ 概述 ...

  5. Oracle经典SQL

    最近本人整理了一些Oracle sql,现分享给大家,后续还会更新.如果有错误的地方,请指正,共同学习.贴上去的sql都是我测试过的,大家可以粘贴在自己的电脑上试试. 1.查询部门的名称,及最低收入雇 ...

  6. MySql_34道经典Sql试题

    MySql_34道经典Sql试题   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiaouncle/article/details/799390 ...

  7. (转)经典SQL查询语句大全

    (转)经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql s ...

  8. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  9. 经典sql语句大全,【转载】

    经典SQL查询语句大全   一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql se ...

随机推荐

  1. Windows 8系统默认开启的.Net Framework版本是4.0,而部分用户可能需要使用到3.5或以下版本,简单添加方法

    从网络途径下载的.Net Framework3.5是无法直接在Windows 8系统上安装的,我们可以通过Windows 8的添加功能来实现 1.打开控制面板,点击”启用或关闭Windows 功能“ ...

  2. MyBatis源码分析-基础支持层反射模块Reflector/ReflectorFactory

    本文主要介绍MyBatis的反射模块是如何实现的. MyBatis 反射的核心类Reflector,下面我先说明它的构造函数和成员变量.具体方法下面详解. org.apache.ibatis.refl ...

  3. Android Launcher分析和修改8——AllAPP界面拖拽元素(PagedViewWithDraggableItems)

    接着上一篇文章,继续分析AllAPP列表界面.上一篇文章分析了所有应用列表的界面构成以及如何通过配置文件修改属性.今天主要是分析PagedViewWithDraggableItems类,因为在我们分析 ...

  4. 完美解决"Encountered an NTFS Volume with a logfile ..."

    完美解决Ghost镜像文件时出现"Encountered an NTFS Volume with a logfile that has not been flushed(536)" ...

  5. OAuth 2.0 C# 版

    using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using Syste ...

  6. 关于CLOS架构的举例 网络级 设备级 FATTREE网络 网络级CLOS 以及CLOS涉及的调度算法RR

    1.概述 CLOS来自于传统电路交换概念,这个概念年代太久远,在当前数据通信网络中,内涵有所变化.本文主要谈的是实际上赋予的与原来略微有所差异的内涵. CLOS架构本身概念比较宽泛,有设备级的CLOS ...

  7. Python 中 __all__ 的作用(转)

    之前看代码每次遇到import *时就会特别蒙,看到这篇文章一下子就弄明白了,原文地址:https://www.cnblogs.com/alamZ/p/6943869.html 1.测试文件foo.p ...

  8. H3C S5120-52P-WiNet交换机配置

    配置console口登录验证密码 <H3C>system-view [H3C]user-interface aux 0 [H3C-ui-aux0]authentication-mode p ...

  9. linux环境中,如何解压后缀是bz2的压缩包?tar.bz2格式的压缩包,如何进行解压?

    问题说明: 今天下载了一个nagios中文的包,名字nagios-cn-3.2.3.tar.bz2,即以tar.bz2结尾,经常解压tar.gz 突然想不起来这个用什么命令来解压了.百度了下,再次记录 ...

  10. MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

    列转行:利用max(case when then) SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CAS ...