1.窗口函數與分析函數
看到一篇寫的很好的總結了,就把鏈接附上把,我們主要是結合一些題目看一下具體的用法(https://blog.csdn.net/scgaliguodong123_/article/details/60135385)
1.1 窗口函數
- FIRST_VALUE:取分組內排序後,截止到當前行,第一個值
- LAST_VALUE: 取分組內排序後,截止到當前行,最後一個值
- LEAD(col,n,DEFAULT) :用於統計窗口內往下第n行值。第一個參數爲列名,第二個參數爲往下第n行(可選,默認爲1),第三個參數爲默認值(當往下第n行爲NULL時候,取默認值,如不指定,則爲NULL)
- LAG(col,n,DEFAULT) :與lead相反,用於統計窗口內往上第n行值。第一個參數爲列名,第二個參數爲往上第n行(可選,默認爲1),第三個參數爲默認值(當往上第n行爲NULL時候,取默認值,如不指定,則爲NULL)
- OVER從句
1.2 分析函數
- ROW_NUMBER() 從1開始,按照順序,生成分組內記錄的序列,比如,按照pv降序排列,生成分組內每天的pv名次,ROW_NUMBER()的應用場景非常多,再比如,獲取分組內排序第一的記錄;獲取一個session中的第一條refer等。
- RANK() 生成數據項在分組中的排名,排名相等會在名次中留下空位
- DENSE_RANK() 生成數據項在分組中的排名,排名相等會在名次中不會留下空位
- CUME_DIST 小於等於當前值的行數/分組內總行數。比如,統計小於等於當前薪水的人數,所佔總人數的比例
- PERCENT_RANK 分組內當前行的RANK值-1/分組內總行數-1
- NTILE(n) 用於將分組數據按照順序切分成n片,返回當前切片值,如果切片不均勻,默認增加第一個切片的分佈。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。
1.3 分類
分爲兩類,
- 專用窗口函數,包括後面要講到的rank, dense_rank, row_number等專用窗口函數。
- 聚合函數,如sum. avg, count, max, min等
2. 用例
2.0 數據
數據很簡單,是自己隨便做的一個成績單。用這個數據集將做些逐漸深入的用例(後續可能會追加)
2.1 對不同ID按成績降序排列,並標記是第幾門科目
用途:研究復購率、多次進線數等
select ID,
sub,
score,
row_number() over(partition by ID order by score desc)
from sc ;
2.2 找出每名同學排名前二的科目和成績。
select
a.ID,
a.sub,
a.score,
a.rk
from (
select *,
rank() over(partition by ID order by score desc) as rk
from sc
) a
where rk <= 2
2.3 選出每科排名前二的學生ID及對應成績
select
a.sub,
a.ID,
a.score,
a.rk
from (
select *,
rank() over(partition by sub order by score desc) as rk
from sc
) a
where rk <= 2