hive row_number()用法

本文深入解析SQL中的row_number(), rank(), dense_rank()等窗口函数的使用方法及应用场景,包括分组排序、连续排序和跳跃排序的特点,以及如何利用row_number()删除重复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、row_number() over()排序功能:

(1) row_number() over()分组排序功能:

     在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行。

partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

例如:employee,根据部门分组排序。

1

2

3

4

5

6

7

8

9

10

<strong>SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee</strong>  

-------------------------------------- 

 A00 152750  1 

 A00 66500   2 

 A00 49250   3 

 A00 46500   4 

 A00 39250   5 

 B01 94250   1 

 C01 98250   1 

 C01 73800   2

  

(2)对查询结果进行排序:(无分组)

1

2

3

4

5

6

7

8

9

10

11

<strong>SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee  </strong>

-------------------------------------- 

 A00 152750  1 

 C01 98250   2 

 D21 96170   3 

 B01 94250   4 

 E11 89750   5 

 E21 86150   6 

 E01 80175   7 

 C01 73800   8 

 D11 72250   9

  

row_number() over()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

 

2、rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

1

2

3

4

5

6

7

8

9

10

11

<strong>select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept; </strong>

------------------ 

A00 39250   1 

A00 46500   2 

A00 49250   3 

A00 66500   4 

A00 152750  5 

B01 94250   1 

C01 68420   1 

C01 68420   1 

C01 73800   3

  

3、dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

1

2

3

4

5

6

7

8

9

10

11

12

<strong>select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;</strong> 

------------------ 

A00 39250   1 

A00 46500   2 

A00 49250   3 

A00 66500   4 

A00 152750  5 

B01 94250   1 

C01 68420   1 

C01 68420   1 

C01 73800   2 

C01 98250   3

  

使用ROW_NUMBER删除重复数据 
---假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行。

1

2

DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE )  

WHERE ROW_NO>1 

  

最后在执行hive 语句时出错, 出现错误:

FAILED: ParseException line 22:7 extraneous input '10' expecting EOF near ''

有看到解释说是,原因是:

sql语句中多了分号。。。

执行脚本时需要在sql后面添加分号,但是调用jdbc执行sql语句时,不可以在语句用分号结束。

 

但依旧没有解决问题。

 

转自:https://www.cnblogs.com/alsf/p/6344197.html

### Hive SQL row_number() 函数的使用方法 在Hive中,`ROW_NUMBER()` 是一种窗口函数,用于分配唯一的行号给每一行数据,在指定的分区或整个查询结果集中按特定顺序排列。 #### 基本语法结构 ```sql ROW_NUMBER() OVER ([PARTITION BY partition_expression] ORDER BY sort_expression) ``` 此表达式的组成部分如下: - `OVER`: 定义如何划分输入行以及应用排序逻辑。 - `PARTITION BY`: 可选参数,用来定义分组标准;如果省略,则视为单一分区处理全部记录。 - `ORDER BY`: 必需项,指明按照哪些字段来决定各行之间的相对位置[^1]。 #### 实际应用场景举例说明 假设有一个名为 `sales` 的表,其中包含销售人员的名字 (`name`) 和销售额度 (`amount`)。为了计算每位销售员在其部门内的排名情况,可以执行如下语句: ```sql SELECT name, department, amount, ROW_NUMBER() OVER(PARTITION BY department ORDER BY amount DESC) AS rank_within_dept FROM sales; ``` 上述代码片段会返回每条记录对应的员工姓名、所属部门名称及其所在部门内基于销售金额降序排列的位置编号。这意味着对于同一个部门中的不同成员来说,拥有较高销售额者将会获得较小的rank_within_dept值。 另外值得注意的是,当涉及到更复杂的业务需求时,比如要获取前几名的数据或者与其他聚合操作相结合等情况,还可以进一步组合其他功能强大的工具如子查询或是CTE(Common Table Expressions),从而实现更加灵活多样的数据分析目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值