Java和大数据系列

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下MySQL的函数-窗口函数
#博学谷IT学习技术支持#


文章目录

  • Java和大数据系列
  • 前言
  • 一、创建一个案例表
  • 二、序号函数- ROW_NUMBER、RANK、DENSE_RANK
  • 三、开窗聚合函数- SUM,AVG,MIN,MAX
  • 四、分布函数- CUME_DIST
  • 五、前后函数-LAG和LEAD
  • 六、头尾函数-FIRST_VALUE和LAST_VALUE
  • 七、其他函数-NTH_VALUE(expr, n)、NTILE(n)
  • 总结

前言

MySQL 8.0 新增窗口函数,窗口函数又被称为开窗函数,与Oracle 窗口函数类似,属于MySQL的一大特点.
非聚合窗口函数是相对于聚函数来说的。聚合函数是对一组数据计算后返回单个值(即分组),非聚合函数一次只会处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。


一、创建一个案例表

# 创建表格
create table employee(dname varchar(20), -- 部门名eid varchar(20),ename varchar(20),hiredate date, -- 入职日期salary double -- 薪资
);
# 插入数据
insert into employee values('研发部','1001','刘备','2021-11-01',3000);
insert into employee values('研发部','1002','关羽','2021-11-02',5000);
insert into employee values('研发部','1003','张飞','2021-11-03',7000);
insert into employee values('研发部','1004','赵云','2021-11-04',7000);
insert into employee values('研发部','1005','马超','2021-11-05',4000);
insert into employee values('研发部','1006','黄忠','2021-11-06',4000);
insert into employee values('销售部','1007','曹操','2021-11-01',2000);
insert into employee values('销售部','1008','许褚','2021-11-02',3000);
insert into employee values('销售部','1009','典韦','2021-11-03',5000);
insert into employee values('销售部','1010','张辽','2021-11-04',6000);
insert into employee values('销售部','1011','徐晃','2021-11-05',9000);
insert into employee values('销售部','1012','曹洪','2021-11-06',6000);

二、序号函数- ROW_NUMBER、RANK、DENSE_RANK

需求:对每个部门的员工按照薪资排序,并给出排名

代码如下(示例):

select dname,ename,salary,row_number() over (partition by dname order by salary desc ) as rk
from employee;select dname,ename,salary,rank() over (partition by dname order by salary desc ) as rk
from employee;select dname,ename,salary,dense_rank() over (partition by dname order by salary desc ) as rk
from employee;

可以看到row_number()输出的结果,rank()和dense_rank()差不太多。大家可以实际试一下看看区别。

三、开窗聚合函数- SUM,AVG,MIN,MAX

在窗口中每条记录动态地应用聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT()),可以动态计算在指定的窗口内的各种聚合函数值。
需求:对每个部门的员工按照薪资排序,并加上前面一位薪资,得到新的一列c1
代码如下(示例):

selectdname,ename,salary,sum(salary) over(partition by dname order by salary   rows between 2 preceding and current row) as c1
from employee;

四、分布函数- CUME_DIST

分组内小于、等于当前rank值的行数 / 分组内总行数
需求:查询小于等于当前薪资(salary)的比例
代码如下(示例):

selectdname,ename,salary,rank() over(partition by dname order by salary desc ) as rn,CUME_DIST() over(partition by dname order by salary desc ) as rn2
from employee;

五、前后函数-LAG和LEAD

返回位于当前行的前n行(LAG(expr,n))或后n行(LEAD(expr,n))的expr的值
需求:查询前1名同学的成绩和当前同学成绩的差值
代码如下(示例):

select dname,ename,hiredate,salary,lag(hiredate,1,'2000-01-01') over(partition by dname order by hiredate) as last_1_time,lag(hiredate,2) over(partition by dname order by hiredate) as last_2_time
from employee;

六、头尾函数-FIRST_VALUE和LAST_VALUE

返回第一个(FIRST_VALUE(expr))或最后一个(LAST_VALUE(expr))expr的值
需求:截止到当前,按照日期排序查询第1个入职和最后1个入职员工的薪资
代码如下(示例):

selectdname,ename,hiredate,salary,first_value(salary) over(partition by dname order by hiredate) as first
from  employee;

七、其他函数-NTH_VALUE(expr, n)、NTILE(n)

将分区中的有序数据分为n个等级,记录等级数
需求:将每个部门员工按照入职日期分成3组
代码如下(示例):

select dname,ename,hiredate,salary,
ntile(3) over(partition by dname order by  hiredate  ) as rn
from employee;


返回窗口中第n个expr的值。expr可以是表达式,也可以是列名
需求:截止到当前薪资,显示每个员工的薪资中排名第2或者第3的薪资

select dname,ename,hiredate,salary,nth_value(salary,2) over(partition by dname order by hiredate) as second_score,nth_value(salary,3) over(partition by dname order by hiredate) as third_score
from employee


总结

今天和大家分享了一下sql中的6种常用的窗口函数的用法,分别是:
1.序号函数- ROW_NUMBER、RANK、DENSE_RANK
2.开窗聚合函数- SUM,AVG,MIN,MAX
3.分布函数- CUME_DIST
4.前后函数-LAG和LEAD
5.头尾函数-FIRST_VALUE和LAST_VALUE
6.其他函数-NTH_VALUE(expr, n)、NTILE(n)
有时间大家可以多练习一下。大数据框架也常用sql语法。窗口函数非常高效。

MySQL六种窗口函数用法案例相关推荐

  1. MySQL - SQL窗口函数

    1.应用场景 窗口函数解决的问题包括: 1)排名问题 2)top N问题 应用工作中, 面试中. 2.学习/操作 前言 MySQL版本8已支持窗口函数这个功能, 如果低于该版本, 会出现SQL报错! ...

  2. MySQL:讨人喜欢的 MySQL replace into 用法(insert into 的增强版)

    讨人喜欢的 MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果 ...

  3. 【node】express中mysql的基本用法、连接池的使用、事务的回滚

    [node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...

  4. Linux下Mysql的查询用法

    Linux下Mysql的查询用法 一.Mysql的delete删除语法 1.删除数据库 2.删除数据库的表 二.查询数据 1.基本查询 2.条件查询 三.数据库插入数据 1.创建新表 2.插入数据 四 ...

  5. MySQL replace into 用法

    MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果存在,则更新 ...

  6. Mysql临时表的用法 - 51CTO.COM

    Mysql临时表的用法 - 51CTO.COM Mysql临时表我们经常会用到,下面就为您详细介绍Mysql临时表的用法,供您参考,如果您对此方面感兴趣的话,不妨一看. 当工作在非常大的表上时,你可能 ...

  7. mysql中as用法

    重命名列名或者表名. as可理解为:用作.当成,作为:一般是重命名列名或者表名.(主要为了查询方便) 重命名列.如:表text, 列 column_1,column_2 你可以写成: 1 select ...

  8. mysql alter怎么用,mysql alter话语用法

    mysql alter语句用法 //主键 ALTER TABLE tablename add new_field_id int(5) UNSIGNED DEFAULT 0 NOT NULL anto_ ...

  9. pdo mysql limit_PHP mysql中limit用法详解(代码示例)

    在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...

最新文章

  1. 【文本分类】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  2. python恶搞小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
  3. alter table add column多个字段_SQL对表中字段的操作 alter
  4. 字符之间或者结构体之间比较
  5. NOI2021模拟测试赛 解题报告
  6. LeetCode 809. 情感丰富的文字
  7. 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!
  8. [0716] Jsoi B Isbn
  9. 如何控制表格的宽度_利用Word制作表格,这些实用技巧一定要知道!制作表格更加快捷...
  10. HoloLens 2开发:电脑端PC识别Vuforia
  11. C# Winform 自动更新程序实例
  12. Gns3模拟器配置Cisco ASA防火墙
  13. 【毕业设计】深度学习 python opencv 火焰检测识别
  14. diskgenius克隆硬盘无法启动_用diskgenius成功拷出故障硬盘数据
  15. 概率论得学习整理--番外3:二项式定理和 二项式系数
  16. C#开发金蝶K3插件
  17. [转]项目实施过程中的风险控制
  18. 软件构造 Lab4 Lab5 实验日记
  19. Echarts实现3d 地图实现飞线效果
  20. L3-1 千手观音【拓扑排序】

热门文章

  1. 【快速开发App实战】BUI高仿网易新闻App系列一、搭建App开发环境和工作空间
  2. docker安装指定版本
  3. 细数Ajax技术的先进性与局限性
  4. 外贸邮箱怎么修改邮箱密码
  5. VBA—EXCEL操作集合—04
  6. 【Python爬虫】简单实现中英翻译器
  7. 【seaborn】3、Distribution plots 分布图
  8. 移动机器人差速轮运动学模型
  9. 调用百度API实现漫画脸生成
  10. GNU/Linux话题