sql中的窗口函数、用户变量和存储过程

我怕爱的太早我们不能终老 提交于 2019-12-01 13:55:04

窗口函数

工作中经常用到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来实现,那就很简单的。

存储过程

暂无,看看别人的资料 。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!