ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hive中一般取top n时,row_number(),rank,dense_ran()常用三个函数

2019-02-21 12:47:42  阅读:995  来源: 互联网

标签:insert dense ran top rank Student1 80 into SELECT


一、 分区函数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

 

 

标签:insert,dense,ran,top,rank,Student1,80,into,SELECT
来源: https://www.cnblogs.com/yfb918/p/10411721.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有