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

hive中一般取top n时,row_number(),rank,dense_ran()常用三个函数的更多相关文章

  1. hive 中窗口函数row_number,rank,dense_ran,ntile分析函数的用法

    hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了, 先简单说下这三函数都是排名的,不过呢还有点细微的区别. 通过代码运行结果一看就明白了. ...

  2. hive中分组取前N个值的实现

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

  3. hive分组排序 取top N

    pig可以轻松获取TOP n.书上有例子 hive中比较麻烦,没有直接实现的函数,可以写udf实现.还有个比较简单的实现方法: 用row_number,生成排名序列号.然后外部分组后按这个序列号多虑, ...

  4. 在hive中查询导入数据表时FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict

    当我们出现这种情况时 FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least ...

  5. sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

    oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案 1.问题描述: 用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了 ...

  6. 为什么在ucos向stm32f103移植时说os_cpu_c.c中有三个函数如OS_CPU_SysTickInit()需要注释掉

    我在看os_cpu_c.c代码时对下面这段话困惑了半天总是在百度的帮助下找到了答案 /*  申明几个函数,这里要注意最后三个函数需要注释掉,为什么呢?    OS_CPU_SysTickHandler ...

  7. Hive中使用Python实现Transform时遇到Broken pipe错误排查

    Hive中有一表,列分隔符为冒号(:),有一列utime是Timestamp格式,需要转成Weekday存到新表. 利用Python写一个Pipeline的Transform,weekday.py的代 ...

  8. SQL Server 分组取 Top 笔记(row_number + over 实现)

    先看SQL语句(注意:这是在SQL Server 2005+ [包括2005] 的版本才支持的哦,o(∩_∩)o 哈哈~) SELECT col1,col2,col3 FROM table1 AS a ...

  9. 从m个数中取top n

    将题目具体一点,例如,从100个数中取出从大到小排前10的数 方法1:使用快速排序 因为快速排序一趟下来,小于K的数都在K的前面,大于K的数都在K的后面 如果,小于K的数有35个,大于K的数有64个 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget的方法中,对于itemBelow.itemAbove方法,官网文档介绍非常简 ...

  2. PyQt(Python+Qt)学习随笔:复选框状态枚举类Qt.CheckState取值及含义

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 老猿Python,跟老猿学Python! 老猿Python博文目录 专栏:使用PyQt开发图形界面P ...

  3. 第十三章、Designer中的按钮Buttons组件详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按 ...

  4. PyQt(Python+Qt)学习随笔:QAbstractScrollArea的viewPort(视口)理解

    老猿Python博文目录 老猿Python博客地址 在学习Designer中ItemViews类部件时,这些部件都有个父类QAbstractScrollArea,该父类是Qt滚动区域的低级抽象.该区域 ...

  5. 抖音CK备份上号原理

    抖音CK备份和上号是点赞跳频繁上号的最好方式,不会的可以访问网站:rz3w.com,下面介绍备份还原的原理:public void run() { MainActivity.a(this.c); ne ...

  6. Alpha冲刺——序言篇(任务与计划)

    Alpha冲刺--序言篇(任务与计划) 1.整个项目预期的任务量 需求规格说明书 架构设计,原型设计,原型改进(给目标用户展现原型,并进一步理解需求) 编码规范完成.平台环境搭建完成.初步架构搭建 队 ...

  7. #2020征文-开发板#SYS_RUN()和MODULE_INIT()之间的那些事

    接触鸿蒙设备开发有一段时间了,也是时候好好挖一挖鸿蒙设备程序的启动流程了. 破冰问题:鸿蒙设备程序从哪里开始运行的? 相信大家都已经非常清楚了,鸿蒙设备程序需要指定入口函数,具体表现在代码层面就是通过 ...

  8. Java集合源码分析(九)——HashSet

    简介 HashSet就是一个集合,里面不能有重复的元素,元素也是无序的. HashSet其实就是调用了HashMap实现的,所以,它也不是线程安全的. HashSet通过iterator()返回的迭代 ...

  9. sql 执行语句函数

    # sql 语句执行函数 def get_access(request): uid=request cursor=connection.cursor() cursor.execute("se ...

  10. Java——排序算法

    java排序从大的分类来看,可以分为内排序和外排序:其中,在排序过程中只使用了内存的排序称为内排序:内存和外存结合使用的排序成为外排序. 下面讲的都是内排序. 内排序在细分可以这样分: 1.选择排序: ...