您現在的位置是:首頁 > 音樂首頁音樂
視窗函式——排名問題
excel錯誤值怎麼隱藏
視窗函式是那些對分割槽或視窗的每一行進行操作的函式。這些函式為每條查詢行產生結果,而聚合函式則將它們分組,並將結果歸入單行。
視窗函式的基本語法:
<視窗函式> OVER ( [ PARTITION BY <列清單> ] ORDER BY <排序用列清單> )
排名視窗函式:
RANK、DENSE_RANK、ROW_NUMBER
能夠作為視窗函式的聚合函式:
SUM、AVG、COUNT、MAX、MIN
非聚類視窗函式(可用於同比、環比等):
LAG、LEAD
PARTITION BY
按指定物件來分類。
ORDER BY
能夠指定按照哪一列、何種順序進行排序。
本文主要是排名視窗函式的應用。
故事:來自真新鎮的10歲天才少年小智,用他25年的學習經驗奪得了世界冠軍。今天他想在隔壁老木那裡看看哪隻傑尼龜和小火龍的攻擊力最高。他簡單的看了下資料,決定用SQL操作一番。
首先看下資料:
SELECT *
FROM pokemon_table;
排名視窗函式的應用:
對上述SQL進行拆分解釋,先來看看OVER括號裡的內容:
PARTITION BY
對pokemon列進行了分組,將小火龍和傑尼龜分為兩大組;
在分完組後,
ORDER BY
對attack列按降序排列,然後分別賦予排名
接下來看看這幾個排名的區別:
RANK
函式:計算排序時,如果存在相同位次的記錄,則會跳過之後的位次。
例如:有 3 條記錄排在第 1 位
時
:1 位、1 位、1 位、4 位
DENSE_RANK
函式:同樣是計算排序,即使存在相同位次的記錄,也不會跳過之後的位次。
例如:有 3 條記錄排在第 1 位時:1 位、1 位、1 位、2 位……
ROW_NUMBER
函式:賦予唯一的連續位次。
例如:有 3 條記錄排在第 1 位時:1 位、2 位、3 位、4 位……
這三個排序還是比較好記的:
rank
:正常排名,會跳位次
dense_rank
:dense單詞是密集的意思,所以排名是緊靠的,不存在跳位次
row_number
:可以這麼記,row是行的意思,每一個人必須單獨佔有一行,所以是1,2,3,4……
另外需要知道的是,排序視窗函式的第一個括號是不需要填任何東西的,而第二個括號中PARTITION BY不是必須項,但是去掉的話,就是按整個表的資料進行處理,不會按組進行分類處理了
總結:
<視窗函式> OVER ( [ PARTITION BY <列清單> ] ORDER BY <排序用列清單> )
<視窗函式>填入RANK()、DENSE_RANK()、ROW_NUMBER(),括號不需要填寫任何東西
PARTITION BY <列清單>:列清單填入所需要的列(可以多個列),視窗函式會按填入的列進行分組,PARTITION BY不是必須項,去掉就是對整個資料進行處理
ORDER BY <排序用列清單>:選定需要按哪一列的資料大小排序
RANK():跳位次、DENSE_RANK():密集排序、ROW_NUMBER():1,2,3...
彩蛋:小智肯定不會只滿足於攻擊力高這一選項,畢竟是頂尖訓練師,所以他接下來要做的事情便是找到綜合實力最高的,平均實力最強的,數量最多的小精靈。