tft每日頭條

 > 生活

 > sql 開窗排序

sql 開窗排序

生活 更新时间:2025-01-22 12:27:19
碎語
  • 學習的正态曲線:入門容易,精通難
  • 積累的正态曲線:先越讀越多,後越讀越少
什麼是開窗函數

很多場景比如排序,累計求和等,如果沒有開窗函數,那麼就要使用很複雜的子查詢或是存儲過程才能做到。為了解決這些問題,就有了現在的開窗函數,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)

  • 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

結果

sql 開窗排序(SQL-開窗函數)2

結果

聚合開窗函數

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

結束語

如果我不能讓您看懂,那是我的問題,如果有疑問可以關注我,然後私聊我,我會盡最大的努力幫助你

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved