分析函数的点点滴滴
1.什么是分析函数:
👉:传送门💖分析函数💖
1.1统计分析函数略解
👉:传送门💖统计分析函数💖
1.2.排序分析函数
👉:传送门💖排序分析函数💖
1.3 开窗函数 ROW 与 RANGE
👉:传送门💖开窗函数 ROW 与 RANGE💖
1.4 统计分析函数详解
👉:传送门💖统计分析函数💖
1.5 不使用order by时
👉:传送门💖不使用order by时💖
1.6 开窗函数与聚合函数
先进行聚合函数,再进行开窗函数
select deptno,
sum(count(empno)) over(order by count(empno)
rows between unbounded preceding and current row)
from emp t group by deptno;
- 1.会先进行聚合函数
select deptno,count(empno) from emp group by deptno order by count(empno)
- 2.再进行开窗函数
- 下图中的结果就是在上图中的结果的基础上进行计算,3,3+6=9,9+6=15
# 开窗函数里面的内容,需要在聚合函数得到的结果的基础上进行
# 如聚合函数中只有deptno和count(empno)
select deptno,
sum(count(empno)) over(order by count(empno)
rows between unbounded preceding and current row)
from emp t group by deptno;
2. 偏移分析函数 lag()与lead()用法
lag()
的使用示例
select e.*,lag(sal) over() from emp e;
# 由下图,显然lag(sal)中有缺省值,为lag(sal,1,null)
-
代码效果及重点标注如下图所示:
-
lead()
的使用示例
select e.*,lead(sal,2,null) over() from emp e;
- 代码效果及重点标注如下图所示:
select e.*,lead(sal,1,null) over(partition by deptno) from emp e;
# 加了分区(分组),所以lead会在组内偏移
- 代码效果及重点标注如下图所示:
- MySQL可以在原始数据上还用
lag()
和lead()
,Oracle需要在over()
中加入内容,如partition by
、order by
Oracle:select e.*,lead(sal,1,null) over(order by empno) from emp e;
Oracle:select e.*,lead(sal,1,null) over(partition by job order by sal) from emp e;
3. mysql低版本怎么实现分组排序:row_number()为例
3.1 原因:mysql8 版本才支持 over partition by 函数
3.2 解决方法:
set @rownum = 0; -- @rownum自增参数,初始化参数为0
set @cid = ''; -- 初始化动态参数cid为空
select 'sid','cid',score
from(
select 'sid',
'cid',
score,
case when @cid = 'cid' then @rownum := @rownum + 1
else @rownum := 1 -- 因为@cid初始化为空,所以第一次循环,@cid ≠ 'cid',所以不执行then,执行else子句
end rn,
@cid := 'cid', -- 第一轮循环时将cid的值赋给@cid
from sc
order by 'cid',score desc -- cid默认升序,score通过desc降序
) a
where rn <= 2;
- 表内容下图左半部分,代码运行解析下图右半部分