您現在的位置是:首頁 > 音樂首頁音樂

視窗函式——排名問題

由 憶無所惑 發表于 音樂2023-01-22
簡介另外需要知道的是,排序視窗函式的第一個括號是不需要填任何東西的,而第二個括號中PARTITION BY不是必須項,但是去掉的話,就是按整個表的資料進行處理,不會按組進行分類處理了總結:<視窗函式> OVER ( [ PARTIT

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...

彩蛋:小智肯定不會只滿足於攻擊力高這一選項,畢竟是頂尖訓練師,所以他接下來要做的事情便是找到綜合實力最高的,平均實力最強的,數量最多的小精靈。

視窗函式——排名問題