SparkSQL三種排序窗口函數(shù)的區(qū)別和聯(lián)系?
1 準(zhǔn)備工作
2 聚合開(kāi)窗函數(shù)
?●?示例1
OVER 關(guān)鍵字表示把聚合函數(shù)當(dāng)成聚合開(kāi)窗函數(shù)而不是聚合函數(shù)。
SQL標(biāo)準(zhǔn)允許將所有聚合函數(shù)用做聚合開(kāi)窗函數(shù)
?●?示例2
OVER 關(guān)鍵字后的括號(hào)中還可以添加選項(xiàng)用以改變進(jìn)行聚合運(yùn)算的窗口范圍。
如果 OVER 關(guān)鍵字后的括號(hào)中的選項(xiàng)為空,則開(kāi)窗函數(shù)會(huì)對(duì)結(jié)果集中的所有行進(jìn)行聚合運(yùn)算。
開(kāi)窗函數(shù)的 OVER 關(guān)鍵字后括號(hào)中的可以使用 PARTITION BY 子句來(lái)定義行的分區(qū)來(lái)供進(jìn)行聚合計(jì)算。
注意:與 GROUP BY 子句不同,PARTITION BY 子句創(chuàng)建的分區(qū)是獨(dú)立于結(jié)果集的,創(chuàng)建的分區(qū)只是供進(jìn)行聚合計(jì)算的,而且不同的開(kāi)窗函數(shù)所創(chuàng)建的分區(qū)也不互相影響。
3?排序開(kāi)窗函數(shù)
3.1 ROW_NUMBER順序排序
row_number() over(order by score) as rownum 表示按score 升序的方式來(lái)排序,并得出排序結(jié)果的序號(hào)
PartitionBy分組
3.2 RANK跳躍排序
rank() over(order by score) as rank表示按 score升序的方式來(lái)排序,并得出排序結(jié)果的排名號(hào)。
這個(gè)函數(shù)求出來(lái)的排名結(jié)果可以并列,并列排名之后的排名將是并列的排名加上并列數(shù)
簡(jiǎn)單說(shuō)每個(gè)人只有一種排名,然后出現(xiàn)兩個(gè)并列第一名的情況,這時(shí)候排在兩個(gè)第一名后面的人將是第三名,也就是沒(méi)有了第二名,但是有兩個(gè)第一名
3.3 DENSE_RANK連續(xù)排序
dense_rank() over(order by ?score) as ?dense_rank 表示按score 升序的方式來(lái)排序,并得出排序結(jié)果的排名號(hào)。
這個(gè)函數(shù)并列排名之后的排名只是并列排名加1
簡(jiǎn)單說(shuō)每個(gè)人只有一種排名,然后出現(xiàn)兩個(gè)并列第一名的情況,這時(shí)候排在兩個(gè)第一名后面的人將是第二名,也就是兩個(gè)第一名,一個(gè)第二名
3.4 NTILE分組排名[了解]
ntile(6) over(order by score)as ntile表示按 score 升序的方式來(lái)排序,然后 6 等分成 6 個(gè)組,并顯示所在組的序號(hào)。
partition by
