碎语什么是开窗函数

很多场景比如排序,累计求和等,如果没有开窗函数,那么就要使用很复杂的子查询或是存储过程才能做到。为了解决这些问题,就有了现在的开窗函数,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;

sql 开窗排序(SQL-开窗函数)(1)

部分结果预览

开窗结构

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

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

函数排名开窗函数栗子

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

结果

sql 开窗排序(SQL-开窗函数)(2)

结果

聚合开窗函数

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

结束语

如果我不能让您看懂,那是我的问题,如果有疑问可以关注我,然后私聊我,我会尽最大的努力帮助你

,