Hive窗口函数row_number()与子查询联用方法详解与实战教程
在Hive中,结合row_number()窗口函数与子查询:先按产品分组并以销售额降序排名,筛选出每组排名为1的记录,随后使用sum()窗口函数按产品排序计算累积销售额,从而仅保留每个产品的最高销售额并逐次累加,适用于TopN分析与累计统计。
在Hive实际开发中,窗口函数row_number()结合子查询是一种非常实用的组合技巧,特别适合需要对结果集进行排序、分区,并仅保留特定排名记录进行后续计算的场景。下面通过一个具体案例来详细拆解这一操作流程。
假设我们有一张销售数据表sales_data,字段包含订单ID(id)、产品ID(product_id)和销售额(amount)。业务目标很明确:首先按销售额从高到低为每个订单排名,然后基于这个排名计算每个产品的累积销售额——注意,这里只针对排名靠前的记录(比如第一名)进行累加。那么对应的SQL应该如何编写?

先看这段核心代码:
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()做好排名过滤,外部查询再对过滤后的结果做分区聚合。这种组合方式在应对复杂统计场景时非常灵活,值得你在实际数据清洗或报表计算中多加尝试。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
NET调用Oracle存储过程并处理多个输出游标的方法
在 NET调用Oracle存储过程返回多个REFCURSOR时,需显式声明每个输出参数,设置Direction为Output、OracleDbType为RefCursor。调用后使用NextResult()按顺序切换游标并检查HasRows。连接字符串需启用Unicode=True和Pooling。建议手动读取避免DataSet Fill()的列名大小写问题
Oracle授予用户执行任意包过程权限的操作指南
Oracle中EXECUTEANYPROCEDURE权限无法执行Package私有过程,仅对Spec公开子程序有效,需额外授权。正确做法是逐个授予GRANTEXECUTEON具体Package,避免越权与审计风险。
Oracle DG主备库DBID冲突导致连接失败的故障处理方法
OracleDataGuard主备库连接失败非DBID冲突,常见原因为DB_UNIQUE_NAME重复、log_archive_config缺失或不一致,或备库未MOUNT。ORA-16047报错时,应先检查备库log_archive_config是否包含主库名。
Oracle 11g RMAN恢复三天前误删数据的方法
RMAN无法直接找回被delete的行,只能通过不完全恢复将整个数据库回退到指定时间点,代价是丢失之后所有变更。优先使用闪回查询或回收站。若必须用RMAN,需有完整备份和归档日志,恢复后需打开resetlogs并导出数据,操作复杂且风险高。
Oracle 11g中监控RMAN备份任务实时剩余时间的完整方法
在Oracle11g中监控RMAN备份剩余时间,不应仅依赖v$session_longops的time_remaining字段,因其存在子任务重置、版本缺陷等不准确性。需结合sofar totalwork计算的百分比进行交叉验证,并添加OPNAMELIKE RMAN% 等过滤条件。RAC环境须使用GV$视图并指定INST_ID,以确保准确性,避免错误判断。
- 热门数据榜
相关攻略
2026-07-16 17:55
2026-07-16 17:55
2026-07-16 17:54
2026-07-16 17:54
2026-07-16 17:54
2026-07-16 17:54
2026-07-16 17:54
2026-07-16 17:53
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

