一、窗口函数基本概念
Mysql8.0支持窗口函数,也称为分析函数,窗口函数与分组聚合函数类似,但是每一行数据都生成一个结果
使用方法:配合聚合窗口函数一起使用,例如SUM/AVG/COUNT/MAX/MIN等等
关键字:over partition by
2、演示
例如我们现在有这样一张数据表
我现在想求每个国家profit的总和,常用的做法是使用聚合函数sum
但是问题来了,我现在想求sum的同时,展示出其他字段的信息比如year,product等,如果是正常的sql需要进行一些额外的操作,但是有了窗口函数一切就变得不一样了,如下图,飒~
这里的关键字是over,partition by 是按照某个字段分区的意思,可以理解为分组 group by
partition by如果不写代表使用整个数据集分区,相当于没有group by
附加:1. 上面的场景partition by不写,结果应该是什么?
2. 其他聚合函数同理,这里就列举了。
二、专用窗口函数
1、首先简单列举一些常用的 专用窗口函数
获取数据排名的:ROW_NUMBER() RAND() DEBSE_RANK() PERCENT_RANK()
获取分组内的第一名或者最后一名等 FIRST_VALUE() LAST_VALUE() LEAD() LAG()
累计分布:CUME_DIST() NTH_VALUE() NTILE()
2、演示
现在我们想求出val的排名,如下图
这个函数有什么用处呢?现在我来说一个经典的面试场景,求所有学生中每门功课成绩的前三名,那这个时候我们就可以是使用窗口函数来解决,sql如下(脑补表结构)
select * from
(select row_number() over (partition by lesson order by score desc) 排名,* from sc) t
where 排名<=3
在上述sql中 我们使用lesson分组,并且使用分数降序,这是每个学生会有一个排名,然后小于等于三即可。
附:当我们后续做最近最基本的数据分析这些窗口函数的时候会有很大的用处。
场景:淘宝新上线了100个商品,需要推给某用户群体,每个用户推荐最符合的10个商品,匹配规则是:商品有标签,用户对商品有对应的动作(购买,购物车,浏览,收藏),
结果是,每个用户对每个商品能求出一个分数,然后按照用户分组,每个商品取前十个的用户。