MYSQL开窗函数详解

基本概念

MYSQL8.0支持窗口函数(Window Function),也称分析函数。窗口函数与组分聚合函数类似,但是每一行数据都会生成一个结果。如果我们将mysql与pandas中的DataFrame做类比学习的话他们的对应关系如下:

  • SQL分组聚合函数对应 => df.groupby([‘分组字段’])[‘目标’].agg()/apply()
  • SQL开窗函数对应 => df.groupby([‘分组字段’])[‘目标’].transform()

所以以下函数:SUM/AVG/COUNT/MAX/MIN等既能做聚合函数又能做窗口函数,可称聚合窗口函数。

如果对pandas的DataFrame中agg()/apply()/transform()这三个方法比较清楚的小伙伴,下面学习开窗函数会特别简单。
在这里插入图片描述

窗口函数表达式

function(args)over(
    partition by …
    order by… [desc]
    frame
)

  • partition by:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别执行,在跨越分区边界时重新初始化。
  • order by:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和partition
    by子句配合使用,也可以单独使用。
  • frame:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。

对于滑动窗口的范围指定,通常使用rows between frame_start and frame_end 语法来表示行范围,frame_start 和 frame_end 可以支持如下关键字,来确定不同的动态行记录:

  • current row 边界是当前行,一般和其他范围关键字一起使用
  • unbounded preceding 边界是分区中的第一行
  • unbounded following 边界是分区中的最后一行
  • expr preceding 边界是当前行减去expr的值
  • expr following 边界是当前行加上expr的值

窗口函数之-排序函数

  • row_number() :序号不重复,序号连续
  • dense_rank() :序号可以重复,序号连续
  • rank() :序号可以重复,序号不连续

分数排序leetcode178题 【不分组排序 】

在这里插入图片描述

select score,dense_rank() over(order by score desc) as 'rank'
from Scores

部门工资最高员工leetcode184题【分组排序】

在这里插入图片描述

select
Department,
Employee,
Salary
from
#----------将下面看作一个表----------
(select
b.name as Department,
a.name as Employee,
Salary,
rank() over(partition by departmentID order by salary desc) as salary_rank
from Employee a
join Department b 
on a.departmentID = b.id) t
#----------用dense_rank()效果一样------------   
where
salary_rank=1

窗口函数之-滑动窗口

在这里插入图片描述

实战演练:

在这里插入图片描述

select product,year_month,gmv,avg(gmv) over (partition by department, product order by year_month rows 2 preceding) as avg_gmv
from product	

输出结果:
在这里插入图片描述

滚动求从上架到本月平均GMV?

select product,year_month,gmv,avg(gmv) over (partition by department, product order by year_month) as avg_gmv
from product	

等价与:

select product,year_month,gmv,avg(gmv) over (partition by department, product order by year_month rows unbounded preceding) as avg_gmv
from product	

在这里插入图片描述
注意:若需要求组内所有数据的平均:

select product,year_month,gmv,avg(gmv) over (partition by department, product) as avg_gmv
from product	

窗口函数之-前后函数

应用:求同比增长、环比增长

  • lead(expression,n):返回当前行的后n行 => shift(-n) 数据超前n阶,与之对齐的就是后n行的数据
  • lag(expression,n):返回当前行的前n行=> shift(n)数据滞后n阶,与之对齐的就是前n行的数据

参数解析:
expression:作用的字段
n:阶数

在这里插入图片描述

select product,year_month,department,gmv,lag(gmv,1) over (partition by department, product order by year_month) as lag_gmv,cast(gmv as double) / lag(gmv,1) over (partition by department, product order by year_month) - 1 as growth_rate
from product

简化写法:

select product,year_month,department,gmv,lag(gmv,1) over w as lag_gmv,cast(gmv as double) / lag(gmv,1) over w - 1 as growth_rate
from product
WINDOW w as (partition by department, product order by year_month)

注意:cast(gmv as double)是将gmv转化为double类型。
在这里插入图片描述
问题:
日期不连续怎么办?
可以通过join万年历解决。

窗口函数求top 10%

  • percent_rank():公式 =(分组内当前的rank值-1)/(分组内总行数-1)
  • cume_dist():公式 =(分组内当前的rank值 )/( 分组内总行数)

对求解出的结果做限制result<=0.1即可得到前10%

  • ntile(n)
    功能:(相当于排序后分桶 / 百分位分桶)
    将排序分区划分特定数量的组;对应每一行,ntile(n)函数返回一个桶号,表示当前行所属的组。

求top10%:去ntile(n)中的n=10分桶后得到组号为1的即为前10%。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

callmode php_Rabbitmq各方法的作用详解

exchange_declare(direct_logs,direct,false,false,false);// 这个是申明交换器&#xff0c;如果没有申明就给默认队列的这个交换器&#xff0c;而且发送的类型默认是direct)顺序参数名默认值作用1$exchange无交换机名2$type无交换机类型&#xff0c;分别有direct、fanout、top…

不同数据库select语句显示前N行数据比对

不同数据SQL对比 有时候我们只想查看一下表的数据的前几行数据&#xff0c;如果不加限制条件的话&#xff0c;默认会查询整个表的数据&#xff0c;等待时间比较久。下面是不同数据库select语句显示前N行数据比对&#xff1a; SQL Server select top 10 * from table_name;D…

hdu2648 Shopping-map容器

Problem Description Every girl likes shopping,so does dandelion.Now she finds the shop is increasing the price every day because the Spring Festival is coming .She is fond of a shop which is called “memory”. Now she wants to know the rank of this shop’s…

你可能需要了解一下的中台

【中台学习】| 作者 / Edison Zhou这是恰童鞋骚年的第201篇原创文章在数字化转型热潮下&#xff0c;各家企业都想建设中台&#xff0c;那么中台是怎么发展起来的&#xff1f;有哪些类型的中台&#xff1f;中台到底是个啥&#xff1f;本文为你一一解答这些问题。1学习背景与前言…

cma检测_CMA检测方法

1、铰页位置偏移检测方法:以铰页轴为基准,用钢直尺测量C1、用有游标卡尺测量C2合格要求:前后,e≤0.2mm;上下或左右,e≤1mm2、门扇中心至门框下门槛尺寸检测方法:在门扇与门框装配好后,准确划好门扇中心线,用钢尺测量C3合格标准:H≤2000,一等,1.0mm二等,1.5mm三等,2.0mmH&#x…

github运行不流畅问题

快速流畅访问Github工具 下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RwdrNK__Vx-AEuUr8sM6pg 提取码&#xff1a;a0tw –来自百度网盘超级会员V3的分享 下载后解压&#xff0c;双击运行.exe文件 运行后长这样&#xff0c;给它丢一边不管就行了。

strcmp()字符串比较函数

字符串比较函数strcmp的比较,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。 基本形式为strcmp(str1,str2), 若str1str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数;

实现option上下移动_js: 实现Select的option上下移动 | 学步园

function UpOrDown(direct, selectId) {//direct : 1:Up, -1:Downvar obj document.getElementById(selectId);var len obj.length;var index obj.selectedIndex;//如果&#xff1a;1.没有选中的项; 2.向上&#xff0c;但已是最上; 3.向下&#xff0c;但是最下&#xff0c;不…

聊聊微信的Dark模式

大家好&#xff0c;我是Z哥。这周微信公布了一个我期待已久的好消息。周一的时候对外公布说&#xff0c;已经完成了iOS版本的Dark模式开发&#xff0c;可能会在下一个版本上线。▲截图来源于微博&#xff0c;版权归原作者所有真的是千呼万唤使出来&#xff0c;很多人期待这个功…

chrome浏览器快速访问stackoverflow

原因&#xff1a;国内网非常多的网站都使用免费的 Google CDN 服务来加载某些 js、字体样式库以提升网页浏览体验&#xff0c;例如 jQuery、Google Fonts。但是目前 Google 的大多数网站在大陆无法正常访问&#xff0c;因此这些本身是加快网页载入的库反而成为了阻塞网站加载的…

字符串哈希-BKDRHash

代码如下&#xff1a; #include <iostream> #include <vector> using namespace std; const int N 10005;struct node {char name[35]; };unsigned int BKDRHash(char *str) {unsigned int key 0, seed 31;while (*str) {key key * seed (*str);}return key …

linux程序已经在后台运行冻结了_Linux 让程序在后台执行

有些程序我们在打开时&#xff0c;会一直占用我们的终端&#xff0c;而且终端还不能关掉&#xff0c;所以这时候我们就需要让程序在后台运行。1.命令&#xff1a;nohupnohup python -u run.py > run.log 2>&1 &参数说明&#xff1a; run.py: 你需要后台运行的程序…

【开源要闻】Canonical发布新OpenStack工具、Kubernetes访客引导方法

Canonical发布支持CephFS的OpenStack Charms 20.02Canonical近日宣布了OpenStack Charms 20.02的全面上市&#xff0c;这是用于在Ubuntu上设计&#xff0c;构建和管理OpenStack私有云的强大工具的主要版本。OpenStack Charms 20.02是一个令人兴奋的版本&#xff0c;它增加了主要…

开窗函数(1)-部门工资前三员工

已知表 题目 公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。 编写一个SQL查询&#xff0c;找出每个部门中 收入高的员工 。 以 任意顺序 返回结果表。 示例 参考答案 selectbase.Departmen…

poj2182 Lost Cows-暴力

Description N (2 < N < 8,000) cows have unique brands in the range 1…N. In a spectacular display of poor judgment, they visited the neighborhood ‘watering hole’ and drank a few too many beers before dinner. When it was time to line up for their ev…

用来表示python代码块的是什么_三分钟带你用简单的Python代码深入理解Python中的元类...

互联网的数据爆炸式的增长&#xff0c;而利用 Python 爬虫我们可以获取大量有价值的数据类也是对象在理解元类前&#xff0c;需要先掌握Python中的类。在大多数编程语言中&#xff0c;类就是一组描述如何生成对象的代码段。在Python中这一点仍然成立&#xff1a;但是&#xff0…

Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

一、前言上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章&#xff0c;其中有不少博友给我提了问题&#xff0c;其中有一个博友问我的一个场景&#xff0c;我给他解答的还不够完美&#xff0c;之后我经过自己的学习查阅并阅读了相关源代码&…

缺失值处理

处理思路 在数据预处理过程中&#xff0c;难免会有数据的确实情况&#xff0c;无论是自己爬虫获取的还是从公开数据源上获取的数据集&#xff0c;都不能保证数据集是完全准确的&#xff0c;难免会有一些缺失值。而以这样数据集为基础进行建模或者数据分析时&#xff0c;缺失值…

2019年第十届蓝桥杯国赛B组试题B-质数拆分-01背包问题+素数筛选

问题描述】 2019可以被分解成若干个两两不同的素数&#xff0c;请问不同的分解方案有多少种&#xff1f; 注意&#xff1a;分解方案不考虑顺序&#xff0c;如 2 2017 2019 和 2017 2 2019 属于同一种方案。答案&#xff1a;55965365465060 代码如下&#xff1a; #includ…

在线教育,异军突起,有一种华丽转身,叫做.NET在线讲师!(全职/兼职皆可)...

在线教育2020年&#xff0c;注定是不平凡的一年&#xff0c;疫情来袭&#xff0c;人们只能潜伏在家&#xff0c;很多人因此没有了收入甚至没有了工作&#xff0c;各个行业&#xff0c;也正在快速升级和重新洗牌&#xff0c;这其中&#xff0c;有一个行业&#xff0c;异军突起&a…