目錄
1. ROW_NUMBER()
2. RANK()
3. DENSE_RANK()
4. NTILE()
5. CUME_DIST()
6. PERCENT_RANK()
1. ROW_NUMBER()
? 功能:ROW_NUMBER() 函數(shù)為每個(gè)分組內(nèi)的行提供唯一的序列號,從1開始。如果在 OVER() 子句中使用 ORDER BY 語句,它將根據(jù)指定的列值對行進(jìn)行排序。
? 對比:
? ?每個(gè)行都會獲得一個(gè)唯一的排名數(shù)字。
? ?即使兩行的排序列值相同,它們也會獲得連續(xù)的排名,不會有相同的排名值。
? 舉例:?
SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) as rank
FROM students;
? 說明:假設(shè) students 表包含學(xué)生的名字和分?jǐn)?shù)。上述查詢將根據(jù)分?jǐn)?shù)降序排列學(xué)生,并為每個(gè)學(xué)生分配一個(gè)唯一的序列號作為排名。如果兩個(gè)學(xué)生分?jǐn)?shù)相同,他們將獲得連續(xù)的排名編號。
2. RANK()
? ? 功能:RANK() 函數(shù)在分組內(nèi)為行提供排名,從1開始。如果兩行或多行在 ORDER BY 子句中指定的排序列上的值相等,則它們將獲得相同的排名,并且排名數(shù)字會跳過。
? ? 對比:
? ? 如果有相同值的行,它們將共享相同的排名。
? ? 在相同值的行之后的排名會跳過那些共享排名的行數(shù)。例如,如果有兩行共享排名1,那么下一個(gè)排名將是3。
? ??舉例:文章來源:http://www.zghlxwxcb.cn/news/detail-834147.html
SELECT name, score, RANK() OVER (ORDER BY score DESC) as rank
FROM students;
? ?說明:使用與 ROW_NUMBER() 相同的數(shù)據(jù),RANK() 函數(shù)將為分?jǐn)?shù)相同的學(xué)生分配相同的排名。如果兩個(gè)學(xué)生的分?jǐn)?shù)相同,他們將共享排名,例如都是排名1,下一個(gè)學(xué)生的排名將是3(假設(shè)只有兩個(gè)學(xué)生分?jǐn)?shù)相同)。
3. DENSE_RANK()
? ?功能:DENSE_RANK() 函數(shù)與 RANK() 函數(shù)類似,為分組內(nèi)的行提供排名,但是它不會跳過排名數(shù)字。
? ?對比:
? ? 與 RANK() 類似,相同值的行會獲得相同的排名。
? ? 不同于 RANK(),DENSE_RANK() 在相同值的行之后不會跳過排名數(shù)字。例如,如果有兩行共享排名1,那么下一個(gè)排名將是2。
? ?舉例:
SELECT name, score, DENSE_RANK() OVER (ORDER BY score DESC) as rank
FROM students;
? ?說明:使用與 RANK() 相同的數(shù)據(jù),DENSE_RANK() 函數(shù)也會為分?jǐn)?shù)相同的學(xué)生分配相同的排名。不同之處在于,它不會跳過排名,所以在上述例子中,下一個(gè)學(xué)生的排名將是2,而不是3。
4. NTILE()
? ?功能:NTILE() 函數(shù)將分組內(nèi)的行分配到指定數(shù)量的桶中,并為每個(gè)行提供桶的編號。這對于數(shù)據(jù)分區(qū)和分布式處理很有用。
? ?對比:
? ? NTILE() 用于更均勻地分配行到固定數(shù)量的桶中,而不是基于其值的排名。
? ? 它更適合于當(dāng)你需要將數(shù)據(jù)均勻地分成幾部分時(shí)使用。
? ?舉例:
SELECT name, score, NTILE(4) OVER (ORDER BY score DESC) as bucket
FROM students;
? 說明:假設(shè)我們想要將學(xué)生根據(jù)分?jǐn)?shù)高低分成4個(gè)桶。NTILE(4) 將學(xué)生分成四個(gè)組,每個(gè)組有相近數(shù)量的學(xué)生,并為每個(gè)學(xué)生分配一個(gè)桶編號。
5. CUME_DIST()
? ? 功能:CUME_DIST()
函數(shù)計(jì)算每個(gè)記錄的累計(jì)分布百分比。這個(gè)函數(shù)返回一個(gè)介于 0 和 1 之間的值,表示小于或等于當(dāng)前記錄值的所有記錄所占的比例。計(jì)算方式是 number of rows preceding or peer with the current row / total rows
。
? ? 對比:
? ? 這是一個(gè)統(tǒng)計(jì)函數(shù),用于計(jì)算行在整體分布中的位置。
? ? 它不提供排名,而是提供了每行相對于整個(gè)數(shù)據(jù)集的位置度量。
? ??舉例:
SELECT name, score, CUME_DIST() OVER (ORDER BY score DESC) as cume_dist
FROM students;
? 說明:這將計(jì)算每個(gè)學(xué)生的累積分布值。在上述查詢中,每個(gè)學(xué)生的 cume_dist 值表示有多少比例的學(xué)生分?jǐn)?shù)低于或等于該學(xué)生。在這個(gè)例子中,每個(gè)學(xué)生的成績會根據(jù)分?jǐn)?shù)從高到低計(jì)算出一個(gè)累計(jì)分布百分比。例如,如果有 10 名學(xué)生,當(dāng)前學(xué)生是按成績排序后的第 3 名,那么前三名(包括當(dāng)前學(xué)生)的學(xué)生數(shù)占總學(xué)生數(shù)的比例即為當(dāng)前學(xué)生的累計(jì)分布百分比。如果前三名的成績相同,那么這三名學(xué)生的累計(jì)分布百分比相同,都是 0.3。
6. PERCENT_RANK()
? ? 功能:PERCENT_RANK()
函數(shù)計(jì)算每個(gè)記錄在結(jié)果集中的相對排名百分比。這個(gè)函數(shù)會返回一個(gè)介于 0 和 1 之間的值,其中 0 表示排名最高(第一位),而 1 表示排名最低(最后一位)。計(jì)算方式是 (rank - 1) / (total rows - 1)
。
? ?對比:
? ? ?PERCENT_RANK() 提供了一個(gè)介于0和1之間的數(shù)值,這個(gè)數(shù)值表示當(dāng)前行的相對排名。
? ? 它用于確定行在其分組內(nèi)的相對位置,而不是一個(gè)絕對的排名數(shù)字。
? ??舉例:
SELECT name, score, PERCENT_RANK() OVER (ORDER BY score DESC) as percent_rank
FROM students;
? ?說明:在這個(gè)例子中,每個(gè)學(xué)生的成績會根據(jù)分?jǐn)?shù)從高到低計(jì)算出一個(gè)百分比排名。第一名的學(xué)生百分比排名是 0,最后一名的百分比排名是 1,其他學(xué)生的百分比排名介于兩者之間。文章來源地址http://www.zghlxwxcb.cn/news/detail-834147.html
到了這里,關(guān)于Hive 排名函數(shù)ROW_NUMBER、RANK()、DENSE_RANK等功能介紹、對比和舉例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!