当前位置: 首页
数据库
Hive窗口函数row_number()与子查询联用方法详解与实战教程

Hive窗口函数row_number()与子查询联用方法详解与实战教程

热心网友 时间:2026-07-15
转载

在Hive中,结合row_number()窗口函数与子查询:先按产品分组并以销售额降序排名,筛选出每组排名为1的记录,随后使用sum()窗口函数按产品排序计算累积销售额,从而仅保留每个产品的最高销售额并逐次累加,适用于TopN分析与累计统计。

在Hive实际开发中,窗口函数row_number()结合子查询是一种非常实用的组合技巧,特别适合需要对结果集进行排序、分区,并仅保留特定排名记录进行后续计算的场景。下面通过一个具体案例来详细拆解这一操作流程。

假设我们有一张销售数据表sales_data,字段包含订单ID(id)、产品ID(product_id)和销售额(amount)。业务目标很明确:首先按销售额从高到低为每个订单排名,然后基于这个排名计算每个产品的累积销售额——注意,这里只针对排名靠前的记录(比如第一名)进行累加。那么对应的SQL应该如何编写?

hive row_number()如何与子查询联用

先看这段核心代码:

SELECT
  id,
  product_id,
  amount,
  SUM(amount) OVER (PARTITION BY product_id ORDER BY amount DESC) as cumulative_sales
FROM (
  SELECT
    id,
    product_id,
    amount,
    ROW_NUMBER() OVER (ORDER BY amount DESC) as row_num
  FROM
    sales_data
) subquery
WHERE
  subquery.row_num <= 1;

这个结构实际上包含了两层逻辑:首先在子查询(别名为subquery)中,对全表按amount降序分配行号——由于没有指定分区,这里的排名是全局的。接着在外部查询中,通过WHERE条件只保留全局排名第一的记录(即row_num <= 1)。然后,在保留的这几条记录上,使用SUM() OVER (PARTITION BY product_id ORDER BY amount DESC)计算每个产品的累积销售额。由于每个产品在子查询结果中最多只保留一条记录(只有该产品的最大销售额恰好是全局第一时才会出现),所以累积销售额其实就是该条记录的amount本身。换个角度理解,这条查询的实际效果是:找出全局销售额最高的那条订单,然后计算该订单所属产品的所有订单累积销售额——不过因为只保留了一条,结果看起来可能有些意外。当然,你可以调整WHERE条件中的阈值(比如改成<= 5),从而对每个产品的前几名进行累积计算。

这里的关键点在于:子查询先用row_number()做好排名过滤,外部查询再对过滤后的结果做分区聚合。这种组合方式在应对复杂统计场景时非常灵活,值得你在实际数据清洗或报表计算中多加尝试。

来源:https://www.yisu.com/ask/85049582.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
NET调用Oracle存储过程并处理多个输出游标的方法

NET调用Oracle存储过程并处理多个输出游标的方法

在 NET调用Oracle存储过程返回多个REFCURSOR时,需显式声明每个输出参数,设置Direction为Output、OracleDbType为RefCursor。调用后使用NextResult()按顺序切换游标并检查HasRows。连接字符串需启用Unicode=True和Pooling。建议手动读取避免DataSet Fill()的列名大小写问题

时间:2026-07-16 17:55
Oracle授予用户执行任意包过程权限的操作指南

Oracle授予用户执行任意包过程权限的操作指南

Oracle中EXECUTEANYPROCEDURE权限无法执行Package私有过程,仅对Spec公开子程序有效,需额外授权。正确做法是逐个授予GRANTEXECUTEON具体Package,避免越权与审计风险。

时间:2026-07-16 17:55
Oracle DG主备库DBID冲突导致连接失败的故障处理方法

Oracle DG主备库DBID冲突导致连接失败的故障处理方法

OracleDataGuard主备库连接失败非DBID冲突,常见原因为DB_UNIQUE_NAME重复、log_archive_config缺失或不一致,或备库未MOUNT。ORA-16047报错时,应先检查备库log_archive_config是否包含主库名。

时间:2026-07-16 17:54
Oracle 11g RMAN恢复三天前误删数据的方法

Oracle 11g RMAN恢复三天前误删数据的方法

RMAN无法直接找回被delete的行,只能通过不完全恢复将整个数据库回退到指定时间点,代价是丢失之后所有变更。优先使用闪回查询或回收站。若必须用RMAN,需有完整备份和归档日志,恢复后需打开resetlogs并导出数据,操作复杂且风险高。

时间:2026-07-16 17:54
Oracle 11g中监控RMAN备份任务实时剩余时间的完整方法

Oracle 11g中监控RMAN备份任务实时剩余时间的完整方法

在Oracle11g中监控RMAN备份剩余时间,不应仅依赖v$session_longops的time_remaining字段,因其存在子任务重置、版本缺陷等不准确性。需结合sofar totalwork计算的百分比进行交叉验证,并添加OPNAMELIKE RMAN% 等过滤条件。RAC环境须使用GV$视图并指定INST_ID,以确保准确性,避免错误判断。

时间:2026-07-16 17:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜