sql 开窗排序(SQL-开窗函数)
- 学习的正态曲线:入门容易,精通难
- 积累的正态曲线:先越读越多,后越读越少
很多场景比如排序,累计求和等,如果没有开窗函数,那么就要使用很复杂的子查询或是存储过程才能做到。为了解决这些问题,就有了现在的开窗函数,MySQL是从8.0版本之后才有了开窗函数,如果要使用,那么必须下载MySQL8.0以上的版本
开窗函数主要是为了给行定义一个窗口,可以理解就是一个分组,但是和group by 的区别在于它不是返回一个聚合值,而是每一行都能返回一个值。举个例子,咱们要求每个月销量和当年总销量以及每个月的销量占比,这时候用sum() 和开窗就很容易了
数据参考:[数据分析师经常遇到的SQL场景解析]数据分析师经常遇到的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;
部分结果预览
开窗结构函数 开窗函数: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
结果
聚合开窗函数可以和很多聚合函数一起使用,如:sum()/count()/min()/max()
结束语如果我不能让您看懂,那是我的问题,如果有疑问可以关注我,然后私聊我,我会尽最大的努力帮助你
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com