1. 程式人生 > 其它 >SQL之開窗函式二——在複雜場景中的實際運用

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