Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何对员工排名?

如何对员工排名?

原创
作者头像
猴子数据分析
修改于 2021-04-19 02:50:01
修改于 2021-04-19 02:50:01
98300
代码可运行
举报
文章被收录于专栏:猴子数据分析猴子数据分析
运行总次数:0
代码可运行

【题目】

雇员表中是员工的基本信息:

问题:查找按名字的首字母升序排列后所在的行数为奇数行的雇员的名字。

如上图所示,这四位雇员的名字首字母分别为G,B,K,A。升序排列后为A,B,G,K,因此奇数行1,3行对应的雇员为名字首字母是A和G开头的。

输出格式:

【解题步骤】

1.排名问题

该题的关键在于如何判断某行按名字首字母排序后的该行的序号以及该序号是奇数还是偶数,我们先将题目简化:

如上图,该表按照字母升序排列后应该为:

关键在于如何得出排序后字母对应的序号,这其实是排名问题。根据《猴子 从零学会SQL》里讲过的排名问题,可以使用窗口函数。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 select *,
2          rank() over (order by 成绩 desc) as ranking,
3          dense_rank() over (order by 成绩 desc) as dese_rank,
4          row_number() over (order by 成绩 desc) as row_num
5 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。

这三个函数的区别如下:

根据题目要求的排名规则,我们要查找按名字的首字母升序排列后所在的行数为奇数行的雇员的名字。

要知道排序后的行数,所以数字不能有相同的,所以这里我们使用row_num函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 select row_number() over (order by 字母) as 序号,       
2        字母
3 from 字母表;

2.找出奇数

排序后的序号已知后,判断奇偶数也变得容易了。

奇数行,就是序号除以2的余数为1,可以用下面两种方法表示

(1)  序号 % 2 = 1

(2)  mod(序号,2) = 1

偶数行则将上面的余数1改为0即可。

在上面的sql上加上where子句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 select row_number() over (order by 字母) as 序号, 字母
2 from 字母表
3 where mod(序号,2) = 1;

这样写有你能发现有什么问题吗?

由于sql的运行顺序,会先运行where子句,再运行select子句。运行where子句的时候,没有“序号”这一列,就会报错。

因此无法直接在后面加上:where mod(序号,2) = 1。需要需要将有序号的查询结果作为临时表(也就是用子查询),修改后的sql如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 with 临时表
2 as
3 (select row_number() over (order by 字母) as 序号,字母
4 from 字母表)
5 select 字母
6 from 临时表
7 where mod(序号,2) = 1;

3.回答题目要求

题目中的雇员表实际也只是比较名字这一列的字母,简化后就是上述的问题。

要求查找按名字的首字母升序排列后所在的行数为奇数行的雇员的名字(方法相同):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 with 临时表
2 as(select row_number() over (order by 名字) as 序号,名字
3 from 雇员表)
4 select 名字
5 from 临时表
6 where mod(序号,2) = 1;

【本题考点】

1.能将复杂的问题简化为简单的问题,如本题将问题简化后,其实就是排名问题

2.排名问题,要想到使用窗口函数实现。在工作我们经常会遇到排名问题,比如对用户搜索对关键词按搜索次数排名,对商品按销售量排名,对员工按kpi排名选出优秀员工。

3.考查如何用mod函数或者%判断奇偶。

【举一反三】

学生表中是学生的基本信息:

问题:查找学号为偶数的学生的全部信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 select *
2 from 学生表
3 where mod(学号,2) = 0;

推荐:如何从零学会sql?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
教你用SQL实现统计排名
在某些应用场景中,我们经常会遇到一些排名的问题,比如按成绩或年龄排名。排名也有多种排名方式,如直接排名、分组排名,排名有间隔或排名无间隔等等,这篇文章将总结几种MySQL中常见的排名问题。
MySQL技术
2020/05/22
1.3K0
你真的会玩SQL吗?表表达式,排名函数
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXISTS和IN之间的区别 你真的会玩SQL吗?无处不在的子查询 你真的会玩SQL吗?Case也疯狂 你真的会玩SQL吗?表表达式,排名函数 你真的会玩SQL吗?简单的 数据修改 你真的会玩SQL吗?你所不知道的 数据聚合 你真的会玩S
欢醉
2018/01/22
1.9K0
你真的会玩SQL吗?表表达式,排名函数
浅谈MySQL窗口函数
含义:窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理。
用户7569543
2022/02/25
1.3K0
浅谈MySQL窗口函数
leetcode-for-sql-排名和窗口函数
本文中带来的是LeetCode-SQL的第178题,讲解的是关于MySQL中的排名问题,非常重要和实用的一篇文章,真心建议搜藏保存:
皮大大
2023/08/23
3730
通俗易懂的学会:SQL窗口函数
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
猴子数据分析
2023/12/14
6560
通俗易懂的学会:SQL窗口函数
这些SQL排名及分析函数,你知道吗?(5)
SQL的排名函数主要有ROW_NUMBER(), RANK(), 和 DENSE_RANK(),它们分别返回行号、排名和紧密排名。这三个函数的区别在于处理并列排名的方式。
万能数据的小草
2024/07/23
2530
这些SQL排名及分析函数,你知道吗?(5)
不要到处翻了 | Hive开窗函数总结与实践
平常我们使用 hive或者 mysql时,一般聚合函数用的比较多。但对于某些偏分析的需求,group by可能很费力,子查询很多,这个时候就需要使用窗口分析函数了~ 注:hive、oracle提供开窗函数,mysql8之前版本不提供,但Oracle发布的 MySQL 8.0版本支持窗口函数(over)和公用表表达式(with)这两个重要的功能!
大数据真好玩
2021/01/26
6.2K0
玩转SQL窗口函数
DENSE_RANK() 函数用来表示排名,与RANK()不同的是,DENSE_RANK() 不会出现空缺数字。比如,如果出现了两个并列的1,DENSE_RANK() 的第三个数仍然是2,而RANK()的第三个数是3。
闫同学
2023/10/10
2750
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
3.8K0
Hive SQL 大厂必考常用窗口函数及相关面试题
mysql中分组排序_oracle先分组后排序
​ 窗口函数(window functions),也被称为 “开窗函数”,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可对数据库数据进行实时分析处理。它是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。
全栈程序员站长
2022/11/10
8K0
SQL进阶-3-排序与窗口函数
在使用数据库制作各种统计数据的时候,需要对数据进行排序,比如按照分数、销量、人数等数值进行排序,通常排序的方法有两种:
皮大大
2021/03/01
8760
SQL进阶-3-排序与窗口函数
通过常见的业务掌握SQL高级功能
窗口函数是对where或者group by 子句处理后的结果进行操作,所以窗口函数原则上只能写在select 子句中。
开心鸭
2020/10/26
1.5K0
通过常见的业务掌握SQL高级功能
2021年大数据Hive(七):Hive的开窗函数
DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
Lansonli
2021/10/11
7650
字节跳动面试题:你的平均薪水是多少?
要求每个部门除去最高、最低薪水后的的平均薪水,所以应该查询出每个部门的最高、最低工资。
猴子数据分析
2021/01/08
8570
MySQL8新特性窗口函数详解
本文博主给大家详细讲解一波 MySQL8 的新特性:「窗口函数」,相信大伙看完一定能有所收获。
wayn
2023/06/14
4690
MySQL8新特性窗口函数详解
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7800
SQL数据分析实战:好用的窗口函数
MySQL——开窗函数
高级开窗函数/ 排名的实现ROW_NUMBER();rank() ,dense_rank()
全栈程序员站长
2021/05/21
2.3K0
MySQL——开窗函数
Hive常用窗口函数实战
本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用
Eights
2020/07/13
2.8K0
Hive的利器:强大而实用的开窗函数
与聚合函数类似,开窗函数也是对行集组进行聚合计算。但是它不像普通聚合函数那样,每组通常只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。
大数据学习与分享
2021/04/22
3.5K0
Hive的利器:强大而实用的开窗函数
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/16
2.8K0
postgreSQL窗口函数总结
相关推荐
教你用SQL实现统计排名
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验