[hive] 窗口函数 ROW_NUMBER()

这篇具有很好参考价值的文章主要介绍了[hive] 窗口函数 ROW_NUMBER()。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ROW_NUMBER()

在 Hive SQL 中,ROW_NUMBER()是一个用于生成行号的窗口函数。

它可以为查询结果集中的每一行分配一个唯一的行号

以下是 ROW_NUMBER() 函数的基本语法:

ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY column3, column4, ...)
  • PARTITION BY 子句可选,用于指定分区列,它将结果集划分为不同的分区。
    每个分区内的行都会有独立的行号计数,即行号从1开始重新计数。

  • ORDER BY 子句用于指定排序列,它决定了如何对分区内的行进行排序。
    行号将根据指定的排序顺序进行分配。

ROW_NUMBER() 函数可以与其他窗口函数(如 RANK()DENSE_RANK())一起使用,以便对查询结果进行更复杂的分析和排序操作。

下面是一个示例,演示如何在 Hive SQL 中使用 ROW_NUMBER() 函数:

SELECT column1, column2, ..., 
	ROW_NUMBER() OVER (ORDER BY column3) as row_num
FROM your_table_name;

在这个示例中,column1、column2 等是查询结果集中的列名,your_table_name 是包含这些列的表名。

ROW_NUMBER() 函数通过 ORDER BY column3 按照 column3 列的值对结果集进行排序,

并为每一行分配一个行号,该行号将在结果集中的 row_num 列中显示。

请注意,ROW_NUMBER() 函数生成的行号是根据指定的排序顺序计算的,并且不会考虑分区之间的顺序。如果需要在分区内进行排序,请使用 ORDER BY 子句来定义排序列

示例

当我们有一个名为 employees 的表,包含以下列:

  • employee_id
  • first_name
  • last_name

我们希望为每个员工生成一个行号,并按照 employee_id 进行升序排序。

可以使用 ROW_NUMBER() 函数来实现这个需求,示例代码如下:

SELECT employee_id, first_name, last_name, 
	ROW_NUMBER() OVER (ORDER BY employee_id) AS row_num
FROM employees;

运行以上查询后,将会得到一个结果集,其中包含每个员工的 employee_id、first_name、last_name 以及对应的行号 row_num。

行号将根据 employee_id 的升序顺序分配。

示例输出可能如下所示:

+-------------+------------+-----------+---------+
| employee_id | first_name | last_name | row_num |
+-------------+------------+-----------+---------+
| 1           | John       | Doe       | 1       |
| 2           | Jane       | Smith     | 2       |
| 3           | David      | Johnson   | 3       |
| 4           | Sarah      | Williams  | 4       |
+-------------+------------+-----------+---------+

在这个示例中,每个员工都被赋予了一个唯一的行号,行号按照 employee_id 的升序进行分配。

窗口函数

窗口函数(Window Function)是一种在查询结果的特定窗口或分区上进行计算的函数。

它可以对查询结果集中的每一行应用聚合排序或其他操作,并生成与该行相关的结果。

窗口函数通常与 OVER 子句一起使用,该子句定义了窗口的范围和排序方式。

通过指定 PARTITION BY 子句,可以将结果集划分为不同的分区,每个分区内的行将独立计算。

通过指定 ORDER BY 子句,可以对分区内的行进行排序,以确定窗口函数的计算顺序。

窗口函数可以用于执行各种分析任务,如计算排名、计算累计值、计算移动平均等。

常见的窗口函数包括 ROW_NUMBER()、RANK()、DENSE_RANK()、SUM()、AVG()、LEAD()、LAG() 等。

下面是一个示例,演示如何使用窗口函数在一个表中计算每个部门的销售总额,并按照销售总额降序排序:

SELECT department, SUM(sales) 
	OVER (PARTITION BY department ORDER BY sales DESC) AS total_sales
FROM sales_table;

在这个示例中,sales_table 是包含销售数据的表,其中包含 department 列和 sales 列。通过使用 SUM() 窗口函数,我们在每个部门内按照销售额降序计算累计销售总额。

  • PARTITION BY department 子句将结果集划分为不同的部门,

  • ORDER BY sales DESC 子句根据销售额降序排序。

窗口函数的输出将作为查询结果的一部分返回,并与其他列一起显示。

它为每一行提供了一个与该行相关的计算结果,而不会对整个结果集进行聚合或过滤。这使得窗口函数成为一种强大的工具,可以在查询中进行灵活的分析和计算。

假设 sales_table 表包含以下数据:

+------------+-------+
| department | sales |
+------------+-------+
| A          | 100   |
| B          | 200   |
| A          | 150   |
| B          | 300   |
| A          | 120   |
| B          | 250   |
+------------+-------+

使用上述示例查询,将会得到如下输出:

+------------+-------------+
| department | total_sales |
+------------+-------------+
| A          | 370         |
| A          | 270         |
| A          | 100         |
| B          | 750         |
| B          | 550         |
| B          | 200         |
+------------+-------------+

在这个示例中,我们按照 department 列进行分区,并按照 sales 列降序排序。然后,对每个部门内的行进行累计求和,得到每个部门的销售总额。注意,结果集中的行顺序与原始数据的顺序可能不同,因为窗口函数会重新排序。

对于部门 A,第一行的销售总额是 370,它等于前三行的销售额之和(150 + 120 + 100)。第二行的销售总额是 270,它等于前两行的销售额之和(120 + 100)。第三行的销售总额是 100,它等于当前行的销售额。

对于部门 B,第一行的销售总额是 750,它等于前三行的销售额之和(300 + 250 + 200)。第二行的销售总额是 550,它等于前两行的销售额之和(250 + 200)。第三行的销售总额是 200,它等于当前行的销售额。

因此,查询的输出结果按照部门和销售总额进行显示。每个部门的销售总额按照降序排列。文章来源地址https://www.toymoban.com/news/detail-728768.html

到了这里,关于[hive] 窗口函数 ROW_NUMBER()的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql之row_number函数

    1.语法 #将字段按照COLUMN1分组COLUMN2排序后分配一个从1开始升序的编号 PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。 PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。 ORDER BY子句定义

    2024年02月03日
    浏览(36)
  • 【hive】hive中row_number() rank() dense_rank()的用法

    主要是配合over()窗口函数来使用的,通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下 row_number是没有重复值的 row_number() 会

    2024年02月12日
    浏览(30)
  • sql中的排序函数dense_rank(),RANK()和row_number()

    dense_rank(),RANK()和row_number()是SQL中的排序函数。 为方便后面的函数差异比对清晰直观,准备数据表如下: 1.dense_rank() 函数语法:dense_rank() over( order by 列名 【desc/asc】) DENSE_RANK()是连续排序,比如遇到相同的数值时,排序时,是1 2 2 3 序号连续的。 按照分数从高到低排名: 按

    2024年02月09日
    浏览(36)
  • row_number 和 cte 使用实例:按照队列进行数据抵消

    今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,现在论坛已经改名叫社区了,也取消了专家分这个设置了。 在进行记录删除前,老顾觉得,有些比较有意思的问题,还是把记录保留下来,比在所

    2024年02月16日
    浏览(36)
  • ROW_NUMBER()、RANK()、DENSE_RANK区别

    ROW_NUMBER()、RANK()、DENSE_RANK区别 ROW_NUMBER() :排序,不会有重复的排序数值。对于相等的两个数字,排序序号不一致 数值 排序序号 1 1 1 2 2 3 DENSE_RANK() :排序,可有重复值。对于相等的两个数字,排序序号一致 数值 排序序号 1 1 1 1 2 2 RANK() :排序,可有重复值。对于相等的两

    2024年02月11日
    浏览(31)
  • GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要: 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 这种问题大部分都是因为PARTITI

    2024年02月06日
    浏览(65)
  • MySQL 实现row_number() over(partition by ) 分组排序功能

    语法格式:   row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by,但不晚于 order by 的执行。   创建测试环境 在线数据库 http://sqlfiddle.com/   1. 创建表   2. Oracle row_number() over(partition by) 分组排序功能   3. M

    2024年02月15日
    浏览(40)
  • mysql8之前如何实现row_number() over(partition by xxx order by xxx asc/desc)

    最近笔者在进行对广告业务的数据统计时遇到这种情况,业务方嫌弃离线数仓太慢,又无需太高的实时性本该使用即席查询的OLAP去做,但是当前公司调研的OLAP还没有推到广告业务侧,无奈只得使用mysql暂时顶一下。我们当前使用的是mysql5.7。 一充用户 :当日只有一次充值的

    2024年02月05日
    浏览(56)
  • hivesql开窗函数row number() over (partition by )详解

    ROW_NUMBER() OVER (PARTITION BY ) 是一种窗口函数,用于在每个分区内对行进行编号。它可以用于分析和报表等场景,可以帮助我们对数据进行分组排序,获取排名信息。 具体来说,ROW_NUMBER() 是一种分析函数,它可以根据 ORDER BY 子句中指定的列对行进行排序,并为每个分区内的行分

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包