MySQL Window Function Descriptions
聚合函数是将多条记录聚合为一条,而窗口函数是每条记录都会执行
win_fn()over (partition by order by frame) as new_row,
partition:分区,窗口函数在不同分组分别执行
order:排序
frame:在分区滑动窗口,可使用一般聚合函数比如avg等
固定窗口函数
Name | Description |
---|---|
CUME_DIST() over_clause | Cumulative distribution value |
DENSE_RANK() over_clause | Rank of current row within its partition, without gaps |
FIRST_VALUE(expr) [null_treatment] over_clause | Value of argument from first row of window frame |
LAG(expr [, N[, default]]) [null_treatment] over_clause | Value of argument from row lagging current row within partition |
LAST_VALUE(expr) [null_treatment] over_clause | Value of argument from last row of window frame |
LEAD(expr [, N[, default]]) [null_treatment] over_clause | Value of argument from row leading current row within partition |
NTH_VALUE(expr, N) [from_first_last] [null_treatment] over_clause | Value of argument from N-th row of window frame |
NTILE(N) over_clause | Bucket number of current row within its partition. |
PERCENT_RANK() over_clause | Percentage rank value |
RANK() over_clause | Rank of current row within its partition, with gaps |
ROW_NUMBER() over_clause | Number of current row within its partition |
创建测试数据框
create table ss.test(id INT,c1 INT,c2 INT
)insert into ss.test (c1,c2) values(2,6);
insert into ss.test (c1,c2) values(1,3);
insert into ss.test (c1,c2) values(1,2);
insert into ss.test (c1,c2) values(1,1);
insert into ss.test (c1,c2) values(2,4);
insert into ss.test (c1,c2) values(2,4);
c2 | c1 |
---|---|
6 | 2 |
3 | 1 |
2 | 1 |
1 | 1 |
4 | 2 |
4 | 2 |
测试
序号函数——row_number() / rank() / dense_rank()
比较区别
row_number不对重复值处理
rank()重复值会并列,后面的值按整体的序号
dense_rank()重复值会并列,后面的值不按整体的序号
select c1,c2,row_number() over (partition by c1 order by c2 asc) as 'new' from ss.test; # 按c1分组,c2排序,给出每行在分组中的序号
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
1 | 3 | 3 |
2 | 4 | 1 |
2 | 4 | 2 |
2 | 6 | 3 |
select c1,c2,rank() over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,求排名
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
1 | 3 | 3 |
2 | 4 | 1 |
2 | 4 | 1 |
2 | 6 | 3 |
select c1,c2,dense_rank() over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,有重复的排名只计算一次
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
1 | 3 | 3 |
2 | 4 | 1 |
2 | 4 | 1 |
2 | 6 | 2 |
应用分组topn
select * from (select c1,c2,row_number() over (partition by c1 order by c2 asc) as 'new' from ss.test) as temp where new <= 2 ;
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
2 | 4 | 1 |
2 | 4 | 2 |
分布函数——percent_rank()/cume_dist()。
percent_rank() : (rank - 1) / (rows - 1),rank为RANK()函数产生的序号,rows为当前窗口的记录总行数
cume_dist():分组内小于等于当前rank值的行数/分组内总行数
select c1,c2,percent_rank() over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,求排名百分比
c1 | c2 | new |
---|---|---|
1 | 1 | 0 |
1 | 2 | 0.5 |
1 | 3 | 1 |
2 | 4 | 0 |
2 | 4 | 0 |
2 | 6 | 1 |
select c1,c2,cume_dist() over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,小于等于当前rank行的百分比
c1 | c2 | new |
---|---|---|
1 | 1 | 0.3333333333333333 |
1 | 2 | 0.6666666666666666 |
1 | 3 | 1 |
2 | 4 | 0.6666666666666666 |
2 | 4 | 0.6666666666666666 |
2 | 6 | 1 |
应用
查看分区后,小于当前值占的百分比,比如小于某个人考试成绩的百分比
前后函数——lead(n)/lag(n)
lead(n):都是错行取值
lag(n):都是错行取值
select c1,c2,lead(c2) over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,错一行取值
c1 | c2 | new |
---|---|---|
1 | 1 | 2 |
1 | 2 | 3 |
1 | 3 | |
2 | 4 | 4 |
2 | 4 | 6 |
2 | 6 |
select c1,c2,lag(c2) over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,错一行取值
c1 | c2 | new |
---|---|---|
1 | 1 | |
1 | 2 | 1 |
1 | 3 | 2 |
2 | 4 | |
2 | 4 | 4 |
2 | 6 | 4 |
应用
按时间排序后,查询两笔订单之间的时间差
取记录函数——first_val(expr)/last_val(expr)/nth_value(expr)
select c1,c2,first_value(c2) over (partition by c1 order by c2 asc) as 'new' from ss.test;# c1分组,c2排序,取每组c2第一个值
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 1 |
1 | 3 | 1 |
2 | 4 | 4 |
2 | 4 | 4 |
2 | 6 | 4 |
select c1,c2,last_value(c2) over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,取每组c2最后一个值
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
1 | 3 | 3 |
2 | 4 | 4 |
2 | 4 | 4 |
2 | 6 | 6 |
select c1,c2,nth_value(c2,2) over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,取每组c2第二个值
c1 | c2 | new |
---|---|---|
1 | 1 | |
1 | 2 | 2 |
1 | 3 | 2 |
2 | 4 | 4 |
2 | 4 | 4 |
2 | 6 | 4 |
应用
取分区后指定位置的值,比如取每个班第二名的成绩
顺序分组
select c1,c2,ntile(2) over (partition by c1 order by c2 asc) as 'new' from ss.test; # c1分组,c2排序,按排序进行分组
c1 | c2 | new |
---|---|---|
1 | 1 | 1 |
1 | 2 | 1 |
1 | 3 | 2 |
2 | 4 | 1 |
2 | 4 | 1 |
2 | 6 | 2 |
滑动frame
frame的语法是BETWEEN frame_start AND frame_end
WINDOW w AS (partition by c1 order by c2 asc ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
生成一个frame在partitioner
分区里滑动
rows BETWEEN 1 PRECEDING AND 1 FOLLOWING
当前行的前一行和后一行,共三行记录
rows UNBOUNDED FOLLOWING
当前行到分区后的最后一行
INTERVAL 7 DAY PRECEDING
一周以内的
窗口命名
1.窗口名称
使用WINDOW w AS
将替换over后面的语句,让语句更加清晰
select c1,c2,cume_dist() over w as 'new' from ss.testWINDOW w AS (partition by c1 order by c2 asc);
参考:
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
https://www.cnblogs.com/DataArt/p/9961676.html
MySQL Window Function Descriptions相关推荐
- MySQl Window Function Concepts
create table test(user_id int1,user_class int1,user_amount int1 );insert into test values (1,1,10); ...
- 窗口函数(Window Function)
文章目录 窗口函数概述 窗口函数和聚合函数的区别 使用要点 应用场景 语法结构 非聚合窗口函数 rank dense_rank row_number cume_dist percent_rank fi ...
- Vue父组件调用子组件的方法并传参的两种方式(用$refs.refName.functionName、window.function)
如需了解儿子怎么控制老子的,传送门:https://s-z-q.blog.csdn.net/article/details/120094689 父组件father.vue <template&g ...
- mysql开启function,Mysql自定義函數(function)
語法 自定義函數也需要相應的要求,語法如下: CREATE FUNCTION(參數列表) RETURNS返回值類型 函數體 刪除: DROPFUNCTION 調用自定義函數語法: SELECT (pa ...
- 窗函数(Window Function)在信号处理当中的应用
窗函数(Window Function)在信号处理当中的应用 1. 从两个重要极限到时域低通滤波器 两个重要极限 数学里常常会把两个非常重要而且非常常见的极限放在一起,并称他们为两个重要极限. 第一个 ...
- mysql8 create table 语法错误_MySQL8.0 Window Function 剖析
title: $MySQL8.0 Window Functions 剖析 author: $马腾 什么是window function window function 是在满足某种条件的记录集合上执行 ...
- mysql window系统备份远程数据库到本地
使用方法:创建test.bat文件,保存以下内容,修改配置后双击打开 @echo offREM 声明采用UTF-8编码 chcp 65001echo. echo MySQL数据库备份脚本 echo. ...
- 窗函数(window function)
原文地址:窗函数(window function) 作者:了凡春秋 窗函数是频谱分析中一个重要的部分,窗函数修正了由于信号的非周期性并减小了频谱中由于泄露而带来的测量不准确性. 快速傅里叶变换假定了时 ...
- 4.2.8. Window Function Calls
4.2.8. Window Function Calls 4.2.8.窗口函数调用 A window function call represents the application of an ag ...
最新文章
- LeetCode Nth Digit
- SpringMVC_4.请求数据
- 数据采集标注、模型调参debug…这个神器统统都能搞定!
- 使用sublime text 开发node.js
- .NET Core 跨平台发布(dotnet publish)
- problem b: 一年中的第几天_第九届蓝桥杯B组试题
- html5 video 直播流无声音,【报Bug】html5plus 使用 VideoPlayer 播放部分rtmp没有声音
- Arrays类及其方法分析
- C语言位域(位段)详解
- iPhone 12 Pro真机照首曝光:无刘海再添实锤?
- linux驱动目录在哪里,详细讲解Linux驱动程序
- STL容器-queue队列
- 古风宣纸背景教学课件讲座PPT模板
- TTL信号也能高速稳定的传输100m+,是的,你没有听错,量产电路推荐
- 计算机系统结构同济大学张晨曦,《计算机系统结构教程(21世纪大学本科计算机专业系列教材)》- 张晨曦 等编著 - 读书评论 - 价值网...
- K倍交叉验证配对t检验
- Android开发技术周报 Issue#8
- css 全屏显示一张图片_css 如何让图片全屏的问题
- mysql导入数据时 USING BTREE 错误解决办法
- centos7.5系统动态扩容磁盘及系统挂载未分配硬盘空间
热门文章
- android 贝塞尔曲线 波浪线,Android 贝塞尔曲线实现水纹波动效果
- js获取session_学习后端鉴权系列: 基于Cookie, Session认证
- 微课|中学生可以这样学Python(7.3.3节):成员方法、类方法、静态方法
- Python实现中英文混排时行号对齐
- Python读取Excel文件统计演员参演电影
- Python使用wordcloud+pillow基于给定图像制作词云
- python 各种排序
- python编写一个函数判断一个数是否为素数是则返回yes_编写函数isPrime,判断一个数字是否为素数,是则返回字符串 YES ,否则返回字符串 NO 。_学小易找答案...
- python怎么输出浮点数_【数会小课堂】Python知识第二弹
- vue = 什么意思_Vue导入模块import xxx from '@/xxx'中的@是什么含义?