1. 程式人生 > 其它 >sql分組,排序等一些函式的用法

sql分組,排序等一些函式的用法

今天專案的兩個地圖資料有問題,經檢查是由於資料重複造成的,需要去重,解決問題後把使用的相關函式彙總一下

group by是分組函式,partition by是分割槽函式(像sum()等是聚合函式),注意區分。

用法: OVER(PARTITION BY… ORDER BY…)

比如例子中的,我建立了八條資料,其中四個人是一班,另外四個是二班,partition by s.class 就是對班級進行分割槽,order by 對成績進行降序排序,最後觀察查出來的rn

row_number() 順序排序

上圖中一班成績為90,85,85,80,在成績相同的情況下,先查出來的資料排名優先,所以排名是1,2,3,4

rank() 跳躍排序,如果有兩個第一級別時,接下來是第三級別

rank()在成績相同的情況下,會把資料並列,就像表裡的兩個85分是並列第二,80分則到了第四,所以是1,2,2,4

dense_rank() 連續排序,如果有兩個第一級別時,接下來是第二級別

與rank不同的是,資料相同的情況下,相同的資料並列後,下一個資料的排名會直接跟在後面而不是把重複的資料排名空出來,所以是1,2,2,3

NTILE()函式是將有序分割槽中的行分發到指定數目的組中,各個組有編號,編號從1開始,就像我們說的’分割槽’一樣 ,分為幾個區,一個區會有多少個。

這裡查詢了3次,第一次分為1個’區’ ,所以查詢結果rn全是1,第二次分為2個區,查詢結果為 1 1 2 2,意思就是 第一個 ‘區’ 為 1 1 兩個編號的資料 ,第二個’區’為 2 2 兩個編號的資料,第三次分為三個區,第一個 ‘區’ 為 1 1 兩個編號的資料,第二個’區’只有2這個資料,第三個’區’只有3這個資料

關於Partition by:

Partition by關鍵字是Oracle中分析性函式的一部分,用於給結果集進行分割槽。它和聚合函式Group by不同的地方在於它只是將原始資料進行名次排列,能夠返回一個分組中的多條記錄(記錄數不變),而Group by是對原始資料進行聚合統計,一般只有一條反映統計值的結果(每組返回一條)。

我們在末尾加一個group by 他會把相同資料分組後合併成一條了,但是partition卻能返回一組中的多條資料