Mysql之窗口函数学习

Mysql之窗口函数学习_第1张图片
聚合是分组后,聚合到一行
而窗口函数,既可以聚合到一行,也可以不聚合
Mysql之窗口函数学习_第2张图片

Mysql之窗口函数学习_第3张图片

1.序号函数

分组排序并添加序号
row_number
rank
dense_rank

1.row_number()

Mysql之窗口函数学习_第4张图片
Mysql之窗口函数学习_第5张图片

按照部门名称进行分组,然后按照薪资进行排序,但是,我们要注意
1.这里分组,但是并没有进行聚合
2.序号排序,是根据num的组进行排序的,也就是,组内排序

2.rank()

Mysql之窗口函数学习_第6张图片
注意看 序号是 1 1 3 4 4 6 也就是说不连续,并且相同序号也相同

3.dense_rank()

Mysql之窗口函数学习_第7张图片
序号 1 1 2 3
重复且连续

4.总结

row_rank 不重复
rank 重复但不连续
dense_rank 重复且连续
如果是要求名次 可以选择rank
如果是要求个数 使用row_rank

2.开窗聚合

1. sum

Mysql之窗口函数学习_第8张图片

select id,num, rank_n,sum(num) over(partition by id ORDER by num  DESC) as ss
from giao

Mysql之窗口函数学习_第9张图片

select id,num,rank_n,sum(num) over(partition by id ORDER by rank_n  DESC) as ss
from giao

Mysql之窗口函数学习_第10张图片
对比一下2个查询,由于排序方式不同,一个按照num排序,一个按照rank_n排序,
结果大不相同,当使用sum(num)同时按照num排序,会直接将相同num的sum相加,并且每个num对应的相应sum相同,可以分析出来.默认排序值相同的是一行,直接相加了,不同才会进行累加

1.rows between 行 preceding and 行

select id,num,sum(num) over(partition by id ORDER by rank_n  DESC rows BETWEEN unbounded preceding and current row) as ss
from giao
select id,num,sum(num) over(partition by id ORDER by rank_n  DESC rows BETWEEN 1 preceding and current row) as ss
from giao

注意这个行是分组后的行,
unbounded preceding默认就是这个,
n preceding 从向上几行到当前行
current row and unbounded following 从当前行加到最后
current row and 1 following 从当前行加到后一行
Mysql之窗口函数学习_第11张图片

3.分布函数

1.cume_dist

Mysql之窗口函数学习_第12张图片
将上面的个数相加并转换为了小数
其实也就是,序号/组内总数

select id,num,CUME_DIST() over(PARTITION by id order by rank_n) as n1 from giao;

Mysql之窗口函数学习_第13张图片

2.percent_rank 感觉没啥用

Mysql之窗口函数学习_第14张图片
Mysql之窗口函数学习_第15张图片
Mysql之窗口函数学习_第16张图片

4.前后函数

LAG LEAD

lag(expr,N,default)

expr:它可以是列或任何内置函数。
N:它是一个正值,它确定当前行之前的行数。如果在查询中将其省略,则其默认值为1
default:如果在当前行之前没有行N行的情况下,它是函数返回的默认值。如果缺少,则默认为NULL。
LAG N就是从这行开始到上面的偏移量
LEAD 就是向下的偏移量
Mysql之窗口函数学习_第17张图片
Mysql之窗口函数学习_第18张图片

5.头尾函数

FIRST_VALUE LAST_VALUE

Mysql之窗口函数学习_第19张图片

其他函数

NTH_VALUE(expr,n) NTILE(n)

Mysql之窗口函数学习_第20张图片
Mysql之窗口函数学习_第21张图片
Mysql之窗口函数学习_第22张图片
Mysql之窗口函数学习_第23张图片

你可能感兴趣的:(大数据,mysql,mysql,学习,数据库)