【题目】

​“成绩表”记录了学生的学号,学生选修的课程,以及对应课程的成绩。

为了对学生成绩进行考核,现需要查询每门课程的前3高成绩。

注意:如果出现并列第一的情况,则同为第一名。

【解题思路】

题目要求找出每个课程获得前三高成绩的所有学生。难点在于每个课程前3高成绩。

前3高的成绩意味着要对成绩排名。

这种题类型其实是“分组排名”,遇到这类型题就要想到用《猴子 从零学会sql》里讲过的窗口函数。

专用窗口函数rank, dense_rank, row_number有什么区别呢?

它们的区别我举个例子,你们一下就能看懂:

select *,rank() over (order by 成绩 desc) as ranking,dense_rank() over (order by 成绩 desc) as dese_rank,row_number() over (order by 成绩 desc) as row_num
from 班级;

得到结果:

从上面的结果可以看出:

rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。
dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。
row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。
这三个函数的区别如下:

题目要求“如果出现并列第一的情况,则同为第一名”。所以,我们使用窗口函数dense_rank。

步骤一:按课程分组(partiotion by 课程号),并按成绩降序排列(order by 成绩 desc),套入窗口函数的语法,就是下面的sql语句:

select *,dense_rank() over(partition by 课程号order by 成绩 desc) as排名
from 成绩表;

运行结果如下:

步骤二:筛选出前3高的成绩,所以我们在上一步基础上加入一个where字句来筛选出符合条件的数据。(where 排名 <=3)

select 课程号,学号,成绩,排名 from
(select *,dense_rank() over (partition by 课程号order by 成绩 desc) as 排名
from 成绩表) as aa
where 排名 <=3;

【本题考点】

1)考察如何使用窗口函数及专用窗口函数排名的区别:rank, dense_rank, row_number

2)经典topN问题:每组最大的N条记录。这类问题涉及到“既要分组,又要排序”的情况,要能想到用窗口函数来实现。

# topN问题 sql模板
select *
from (select *, row_number() over (partition by 要分组的列名order by 要排序的列名 desc) as 排名from 表名) as a
where 排名 <= N;

【举一反三】

Employee 表包含所有员工信息,每个员工有其对应的工号( Id),姓名 (Name),工资 (Salary) 和部门编号( DepartmentId) 。

查找每个部门前三高工资的员工。例如,根据上述给定的表,查询结果应返回:

参考答案:

select DepartmentId,Name,Salary
from (select *, dense_rank() over (partition by DepartmentIdorder by Salary desc) as rankingfrom Employee) as a
where ranking <= 3;

推荐:如何从零学会sql?

对应sql建表_图解SQL面试题:如何查找工资前三高的员工相关推荐

  1. sql 过滤空值_图解 SQL,这简直太形象了吧!

    作者: 不剪发的Tony老师 来源:CSDN 链接:http://r6d.cn/qKD6 本文介绍关系数据库的设计思想:在 SQL 中,一切皆关系.在计算机领域有许多伟大的设计理念和思想,例如: 在 ...

  2. [学习SQL SERVER 2005系列]图解SQL SERVER2005的安装

    [学习SQL SERVER 2005系列]图解SQL SERVER2005的安装 前言: [学习SQL SERVER 2005系列]准备把学习2005的一些心得整理出来,和大家分享,共同学习一起提高. ...

  3. JEPaas代码(SQL功能表)通过SQL功能表进行表查询

    JEPaas代码(SQL功能表)通过SQL功能表进行表查询 1.新建一个表单--添加功能表--在功能表配置信息中///如下: 输入相应的SQL查询语句"(在那之前通过SQLserver查询语 ...

  4. 【SQL编写实战】查询部门工资前三高的所有员工

    [SQL编写实战]查询部门工资前三高的所有员工 最近看到一个sql 题 描述为: Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 D ...

  5. 2022-12-05:部门工资前三高的所有员工。编写一个SQL查询找出每个部门中收入前三高的员工 。 +------------+----------+--------+ | Department |

    2022-12-05:部门工资前三高的所有员工.编写一个SQL查询找出每个部门中收入前三高的员工 . ±-----------±---------±-------+ | Department | Em ...

  6. mysql建库、建表命令、sql语句大全

    1.常见的关系型数据库 SQL Server 微软提供 Oracle 甲骨文公司 DB2 IBM MySQL 瑞典MySQL AB Sybase Sybase公司 SQLite 迷你的数据库,用在一些 ...

  7. 数据库建表原则,SQL数据库建表前期优化,SQL数据库操作优化,数据库命名规范...

    2019独角兽企业重金招聘Python工程师标准>>> 关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关 ...

  8. sql如何遍历几百万的表_关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  9. 数据库系统—SQL建表+基础

    1. 表定义 建表语句 create table 表名 ( 属性 类型 注释 [默认值], 属性 类型 注释 [默认值], - ) drop table if exists student; crea ...

最新文章

  1. 【问链-链改进行时】 第二课 链改的技术架构选择
  2. mos管结电容等效模型_为什么我的mos管炸了???
  3. MDT2012部署问题,MDT中的驱动是如何工作的
  4. python3.6.8下robot framework ride 测试环境搭建
  5. OpenCV中cvWaitKey()函数注意事项
  6. java 编译时找不到同一包中的文件_Java基础笔试练习(七)
  7. 【HDU - 1045】Fire Net (dfs 或二分图)
  8. java 减法基础_java基础之运算符
  9. size_t和size_type类型
  10. EA(Enterprise Architecture,企业架构)
  11. P1048 采药 洛谷Oj
  12. C#SHA1算法及注意事项
  13. 微信小程序实例练习——《排班查询》
  14. 用photoShop简单提取他人的签名
  15. She Will Be Loved
  16. Window10系统下触摸板失灵了 该咋处理
  17. warning: iteration xxxu invokes undefined behavior [-Waggressive-loop-optimizations]
  18. 一些Mac OS X技巧
  19. Linux安装Rar软件与压缩、解压方法
  20. 如何更改虚拟光驱与物理光驱的盘符

热门文章

  1. Cocos2d-x之MenuItem
  2. VS2008 Web Application和Web Site的区别[转]
  3. springboot上传文件过大,全局异常捕获,客户端没有返回值
  4. 机器学习深度学习知识点总结
  5. 费诺编码c语言实验报告,formal parameter 4 different from declaration
  6. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
  7. k8s 拉取镜像失败_k8s 拉取私有仓库失败
  8. java经纬度凸包graham_计算几何-凸包-Graham算法
  9. 吴恩达|机器学习作业2.1正则化的Logistic回归
  10. 吴恩达机器学习学习笔记第一章:绪论初识机器学习