hive中一般取top n時,row_number(),rank,dense_ran()常用三個函數


一、 分區函數Partition By與row_number()、rank()、dense_rank()的用法(獲取分組(分區)中前幾條記錄)

一、數據准備

--1、創建學生成績表
id int,  --主鍵
Grade int, --班級
Score int --分數
CREATE TABLE Student3(id INT, grade INT,score int)
CLUSTERED by(id) INTO 7 BUCKETS
STORED AS ORC 
tblproperties('transactional'='true');
 
insert into Student1 values(1,1,88);
insert into Student1 values(2,1,66);
insert into Student1 values(3,1,75);
insert into Student1 values(4,2,30);
insert into Student1 values(5,2,70);
insert into Student1 values(6,2,80);
insert into Student1 values(7,2,60);
insert into Student1 values(8,3,90);
insert into Student1 values(9,3,70);
insert into Student1 values(10,3,80);
insert into Student1 values(11,3,80);
 
--向普通表中入數據
CREATE TABLE Student(id INT, grade INT,score int);
INSERT INTO TABLE student SELECT * FROM student1;
SELECT * FROM Student;

 

二、分區函數partition by與row_number()的用法

--2、1不分班按學生成績排名
SELECT *,row_number() over(ORDER BY score desc) assequence FROM student;

SELECT *,row_number() over(PARTITION BY grade ORDER BY score desc) AS sequence FROM student;

 

--2、3獲取每個班的前一名
SELECT * FROM (
SELECT *,row_number() OVER(PARTITION BY grade ORDER BY score DESC) AS SEQUENCE FROM student
) squence_table WHERE squence_table.SEQUENCE<=1;

 

三、分區函數partition by與排序rank()的用法

--1、分班后按學生成績排名,該語句是對分數相同的記錄進行了同一排名,比如:兩個80分的並列第2名,因此,第4名就沒用了
SELECT *,rank() over(PARTITION BY grade ORDER BY score desc) AS SEQUENCE FROM student;
 

 

--2、獲取每個班的前2名,該語句是對分數相同的記錄進行了同一排名,例如:兩個80分並列第2
SELECT * FROM (
SELECT *,rank() over(PARTITION BY grade ORDER BY score desc) AS SEQUENCE FROM student
) squence_table WHERE squence_table.SEQUENCE<=2;

 

三、分區函數partition by與 dense_rank()的用法
--1、分班后按學生成績排名,該語句是對分數相同的記錄進行了同一排名,比如:兩個80分的並列第2名,而位列排名第4位的同學,成績排名則從第3開始,
--如果是row_number,排名則為90-1,80-2,80-3,70-4;如果是rank()則為;90-1,80-2,80-2,70-4
--使用dense_rank()則為90-1,80-2,80-2,70-3
SELECT *,dense_rank() over(PARTITION BY grade ORDER BY score desc) AS SEQUENCE FROM student;
 

 

--2、獲取每個班的前3名,該語句是對分數相同的記錄進行同一排名
SELECT * FROM (
SELECT *,dense_rank() over(PARTITION BY grade ORDER BY score desc) AS SEQUENCE FROM student
)squence_table WHERE squence_table.SEQUENCE<=3;
 
四、窗口函數,row_number() ,rank(),dense_rank()區別
舉例:同一班級下:成績依次為90,80,80,70
row_numer()對於同一分組、相同分數的排名:比如:第一名為90,第二名80,第三名80,第四名70
rank()對於同一分組、相同分數的排名:比如:第一名為90,第二名80,80並列,第四名70,則沒有第三
dense_rank()對於同一分組、相同分數的排名:比如:第一名為90,第二名為80,80並列,第三名為70

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM