SQL之開窗函式二——在複雜場景中的實際運用
1.使用開窗函式求移動平局值
大家看股票的時候,經常會看到K線圖,裡面經常用到的5日、30日移動平均趨勢圖,那如何使用視窗函式求移動平均值呢
(1)現有一張表Stock,求5日 移動平均值
原表資料結構如下:
查詢5日平均價格語句:
select stockname ,TradingDate ,price ,avg(price) over(partition by stockname order by tradingdate rows between 4 preceding and current row) as fievedaysavgprice from Stock
結果如下:
語法總結:
sum(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..)
avg(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..)
A:需要被加工的欄位名稱
B:分組的欄位名稱
C:排序的欄位名稱
D:計算的行數範圍
rows between unbounded prceding and current row --包括本行和之前所有的行
rows between current row and unbounded following --包括本行和之後所有的行
rows between 3 preceding and current row --包括本行以內和前三行
rows between 3 preceding and 1 following --從前三行到下一行 (5行)
2.分組排序視窗函式實際運用 ntile (n)over(......)
ntile(n) over(partition by ...A... order by ...B...)
n:切片的片數
A:分組的欄位名稱
B:排序的欄位名稱
ntile(n) :用於將分組資料按照順序切分成n片,返回當前切片值
如果切片不均勻,預設增加到第一個切片的分佈
例子:選出2021年退款金額排名前20%的使用者
原資料表:user_refund
查詢退款20%的語句:具體分析就是按照使用者退款金額總數降序分成5組,取第一組的資料
select * from ( select [user_name] ,sum(refund_amount) as refund_amount ,ntile(5) over(order by sum(refund_amount) desc) as level from user_refund where year(refund_time)=2021 group by [user_name] ) as a where a.level=1