很多場景比如排序,累計求和等,如果沒有開窗函數,那麼就要使用很複雜的子查詢或是存儲過程才能做到。為了解決這些問題,就有了現在的開窗函數,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)
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()
結束語如果我不能讓您看懂,那是我的問題,如果有疑問可以關注我,然後私聊我,我會盡最大的努力幫助你
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!