窗口函数
工作中经常用到mysql,竟然没听过窗口函数,说明我的基础还不够,随时保持学习的态度。
窗口函数,也可以被称为OLAP函数或分析函数。mysql之前并不支持窗口函数,但也可以用其他方法实现,但mysql8.0是有窗口函数的,可以看看这篇文档。
先看看别人的笔记,学习一下:
SQL Server中的窗口函数
oracle:分析函数(评级函数、窗口函数等)
使用变量解决问题
问题:
编一个问题如下:一个人玩了20次掷骰子的游戏,记录每次骰子的点数,得到如下数据表game_table。
id(次数) p(点数)
1 3
2 5
3 2
4 1
5 3
6 4
7 6
8 6
9 5
10 1
11 1
12 1
13 3
14 6
15 5
16 2
17 4
18 4
19 5
20 3
现在他想知道,至少连续两次出现了相同的点数的记录有哪些,怎样用mysql实现?
先给出结果如下:
id(次数) p(点数)
7 6
8 6
10 1
11 1
12 1
17 4
18 4
select id, p , @p_2, if( p=@p_2, @rank, @rank+1) as y, (@p_2 = p) as p
from game_table, (select @p_2:=0) as a , (select @rank:=0) as b;
#@p_2的初始值为0, 通过(@p_2 = p)将p赋值给变量@p_2,所以下一行的@p_2等于上一行的p值。
#@rank变量初始值为0,当p和@p_2相等时,@rank会不变,即和上一行的@rank相等;当p和@p_2两者不等时,@rank会自动加1。
这时候,只要连续相等的两个p值,其对应的y值是相同的。所以再对上面得到的结果进行分组,找出数量大于等于2次的y值,再把次数结果通过连接加到上表中,用字段y_2表示,最后用where筛选出y_2大于等于2的记录即可。
另外,8.0版本的mysql支持窗口函数,可以用 count(*) over (partition by y ) as y_2
来计算y_2, 会更加方便。
有点忙,上述sql代码还没跑过,可能有错误,抽空跑一下。
这里只是要求用mysql来实现,如果用pyton或者R来实现,那就很简单的。
存储过程
暂无,看看别人的资料 。
来源:CSDN
作者:YangJianShuai
链接:https://blog.csdn.net/yj1556492839/article/details/80387057