mysql分析函数开窗函数_数据分析-SQL-开窗函数

碎语

学习的正态曲线:入门容易,精通难

积累的正态曲线:先越读越多,后越读越少

什么是开窗函数

很多场景比如排序,累计求和等,如果没有开窗函数,那么就要使用很复杂的子查询或是存储过程才能做到。为了解决这些问题,就有了现在的开窗函数,MySQL是从8.0版本之后才有了开窗函数,如果要使用,那么必须下载MySQL8.0以上的版本

开窗函数主要是为了给行定义一个窗口,可以理解就是一个分组,但是和group by 的区别在于它不是返回一个聚合值,而是每一行都能返回一个值。举个例子,咱们要求每个月销量和当年总销量以及每个月的销量占比,这时候用sum() 和开窗就很容易了

数据参考:数据分析师经常遇到的SQL场景解析

select

sal_year,

sal_month,

sum_sale,#销量

sum(sum_sale) over(partition by sal_year) as cumu_sal,##年总销量

sum_sale/(sum(sum_sale) over(partition by sal_year)) as ratio ##每个月销量占全年销量的占比

from

(select

year(date(order_date) )as sal_year,

month(date(order_Date) )as sal_month,

sum(sales) as sum_sale

from

chaoshi.order

group by

year(date(order_date) ),

month(date(order_Date) )

)a

order by

sal_year,

sal_month;

743aa9298aa0

结果预览

开窗结构

函数+开窗函数:row_number() over()

row_number() over(partition by xx order by yy rows between zz and aa)

partition by:分组,顾名思义就是以什么字段进行分组,形式跟group by 一样

order by : 排序,对分完组后的数据,进行组内的排序

rows between :窗口,计算的窗口,between后可以跟如下的内容:

unbounded preceding:第一行

unbounded following:最后一行

current row:当前行

N preceding:前N行

N following:后N行

一般省略了rows的时候默认都是从开窗后的第一行到当前行,后面的具体例子会讲解

row_number() 就是一个函数,开窗一般都是与排序和聚合函数一起使用

函数

排名开窗函数

row_number ():排序之后不管有没有重复值都是一直往上再加序号

dense_rank():排序之后遇到重复值会生成一样的序号,但是接下来的序号连续

rank():排序之后遇到重复值会生成一样的序号,接下来的序号不连续,具体如下栗子

栗子

with test as (##创建了一个临时表

select

1 as num

from

dual

union all

select

2 as num

from

dual

union all

select

2 as num

from

dual

union all

select

3 as num

from

dual

union all

select

4 as num

from

dual

)

select

num ,

row_number() over(order by num ) as row_number1,

rank() over(order by num) as rank1,

dense_rank() over(order by num) as dense_rank1

from

test ##上面的临时表test

结果

743aa9298aa0

不同排序的结果

聚合开窗函数

可以和很多聚合函数一起使用,如:sum()/count()/min()/max()

结束语

如果我不能让您看懂,那是我的问题,如果有疑问可以关注我,然后私聊我,我会尽最大的努力帮助你。如果觉得对你有帮助,请帮忙点赞/关注,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值