对应sql建表_图解SQL面试题:如何查找工资前三高的员工
【题目】
“成绩表”记录了学生的学号,学生选修的课程,以及对应课程的成绩。
为了对学生成绩进行考核,现需要查询每门课程的前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面试题:如何查找工资前三高的员工相关推荐
- sql 过滤空值_图解 SQL,这简直太形象了吧!
作者: 不剪发的Tony老师 来源:CSDN 链接:http://r6d.cn/qKD6 本文介绍关系数据库的设计思想:在 SQL 中,一切皆关系.在计算机领域有许多伟大的设计理念和思想,例如: 在 ...
- [学习SQL SERVER 2005系列]图解SQL SERVER2005的安装
[学习SQL SERVER 2005系列]图解SQL SERVER2005的安装 前言: [学习SQL SERVER 2005系列]准备把学习2005的一些心得整理出来,和大家分享,共同学习一起提高. ...
- JEPaas代码(SQL功能表)通过SQL功能表进行表查询
JEPaas代码(SQL功能表)通过SQL功能表进行表查询 1.新建一个表单--添加功能表--在功能表配置信息中///如下: 输入相应的SQL查询语句"(在那之前通过SQLserver查询语 ...
- 【SQL编写实战】查询部门工资前三高的所有员工
[SQL编写实战]查询部门工资前三高的所有员工 最近看到一个sql 题 描述为: Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 D ...
- 2022-12-05:部门工资前三高的所有员工。编写一个SQL查询找出每个部门中收入前三高的员工 。 +------------+----------+--------+ | Department |
2022-12-05:部门工资前三高的所有员工.编写一个SQL查询找出每个部门中收入前三高的员工 . ±-----------±---------±-------+ | Department | Em ...
- mysql建库、建表命令、sql语句大全
1.常见的关系型数据库 SQL Server 微软提供 Oracle 甲骨文公司 DB2 IBM MySQL 瑞典MySQL AB Sybase Sybase公司 SQLite 迷你的数据库,用在一些 ...
- 数据库建表原则,SQL数据库建表前期优化,SQL数据库操作优化,数据库命名规范...
2019独角兽企业重金招聘Python工程师标准>>> 关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关 ...
- sql如何遍历几百万的表_关于SQL查询效率,100w数据,查询只要1秒
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...
- 数据库系统—SQL建表+基础
1. 表定义 建表语句 create table 表名 ( 属性 类型 注释 [默认值], 属性 类型 注释 [默认值], - ) drop table if exists student; crea ...
最新文章
- 【问链-链改进行时】 第二课 链改的技术架构选择
- mos管结电容等效模型_为什么我的mos管炸了???
- MDT2012部署问题,MDT中的驱动是如何工作的
- python3.6.8下robot framework ride 测试环境搭建
- OpenCV中cvWaitKey()函数注意事项
- java 编译时找不到同一包中的文件_Java基础笔试练习(七)
- 【HDU - 1045】Fire Net (dfs 或二分图)
- java 减法基础_java基础之运算符
- size_t和size_type类型
- EA(Enterprise Architecture,企业架构)
- P1048 采药 洛谷Oj
- C#SHA1算法及注意事项
- 微信小程序实例练习——《排班查询》
- 用photoShop简单提取他人的签名
- She Will Be Loved
- Window10系统下触摸板失灵了 该咋处理
- warning: iteration xxxu invokes undefined behavior [-Waggressive-loop-optimizations]
- 一些Mac OS X技巧
- Linux安装Rar软件与压缩、解压方法
- 如何更改虚拟光驱与物理光驱的盘符
热门文章
- Cocos2d-x之MenuItem
- VS2008 Web Application和Web Site的区别[转]
- springboot上传文件过大,全局异常捕获,客户端没有返回值
- 机器学习深度学习知识点总结
- 费诺编码c语言实验报告,formal parameter 4 different from declaration
- pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
- k8s 拉取镜像失败_k8s 拉取私有仓库失败
- java经纬度凸包graham_计算几何-凸包-Graham算法
- 吴恩达|机器学习作业2.1正则化的Logistic回归
- 吴恩达机器学习学习笔记第一章:绪论初识机器学习