SQL_窗口函數

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章