当前位置: 首页 > news >正文

【Hive 开发进阶】窗口函数深度解析:OVER/NTILE/RANK 实战案例与行转列高级技巧

一、窗口函数 OVER 详解

窗口函数用于在分组内进行数据排名、聚合计算等操作,语法格式:

函数名() over([partition by 分组字段] [order by 排序字段] [window子句])
案例:员工信息与部门平均工资
create table emp (id int,dept string,salary double
);select id, dept, salary,avg(salary) over(partition by dept) as 部门平均工资
from emp;
二、序列函数
1. NTILE(数据分桶)
-- 将消费记录按金额分成2桶
select id, amount,ntile(2) over(order by amount desc) as 桶号
from sales;
2. LAG 与 LEAD(前后行数据获取)
-- 查询顾客上次购买时间
select user_id, order_time,lag(order_time, 1, '无历史记录') over(partition by user_id order by order_time) as 上次购买时间
from orders;
3. FIRST_VALUE 与 LAST_VALUE
-- 获取每个班级最高分和最低分
select class, score,first_value(score) over(partition by class order by score desc) as 最高分,last_value(score) over(partition by class order by score) as 最低分
from stu_score;
三、排名函数
函数特点
ROW_NUMBER()顺序排名,无重复
RANK()并列排名,有空位
DENSE_RANK()并列排名,无空位
案例:班级成绩排名
select id, class, score,row_number() over(partition by class order by score desc) as rn_row,rank() over(partition by class order by score desc) as rn_rank,dense_rank() over(partition by class order by score desc) as rn_dense
from stu_score;

部分输出结果

idclassscorern_rowrn_rankrn_dense
1A95111
2A95211
3A90332
四、窗口子句(WINDOW 子句)
-- 计算当前行与前两行的消费总和
select user_id, order_time, amount,sum(amount) over(partition by user_id order by order_time rows between 2 preceding and current row) as 近3次消费总额
from orders;
五、综合实战:行转列进阶
-- 需求:将课程表转换为选修/未选修状态(中文显示)
select id,if(array_contains(collect_set(course), 'a'), '选修', '未选修') as a,if(array_contains(collect_set(course), 'b'), '选修', '未选修') as b
from courses group by id;

输出结果

idab
1选修选修
2选修未选修
3选修选修
http://www.xdnf.cn/news/642079.html

相关文章:

  • Day02
  • springboot日志
  • NotePad++编辑Linux服务器文档
  • 安全权限管理:从零到精通Android动态权限请求机制
  • CV中常用Backbone-3:Clip/SAM原理以及代码操作
  • Spring Boot 项目中常用的 ORM 框架 (JPA/Hibernate) 在性能方面有哪些需要注意的点?
  • 2025年- H50-Lc158 --25. k个一组翻转链表(链表,双指针,虚拟头节点)--Java版
  • Muduo网络库流程分析
  • quill 富文本多张图片排序
  • SRS流媒体服务器之RTC播放环境搭建
  • 揭开C语言指针的神秘面纱:地址、变量与“指向”的力量
  • systemverilog的单精度浮点和双精度浮点
  • AI测试怎么做投入产出比分析以及人员分配?
  • YOLOV8涨点技巧之DSS模块(一种轻量化火灾检测模型)
  • Unity引擎源码-物理系统详解-其三
  • C++23 std::out_ptr 和 std::inout_ptr:提升 C 互操作性
  • 锁与死锁的诊断:如何通过 SHOW ENGINE INNODB STATUS 解锁瓶颈
  • 加密货币投资亏损后,能否以“欺诈”或“不当销售”索赔?
  • 如何在 Windows 11 上安装 Ubuntu 20.04 WSL2
  • 《红警2000》游戏信息
  • YOLOv8源码修改(5)- YOLO知识蒸馏(下)设置蒸馏超参数:以yolov8-pose为例
  • Karakeep | 支持Docker/NAS 私有化部署!稍后阅读工具告别云端依赖,让知识收藏更有序
  • 机器学习---特征降维
  • C++指针与引用:const修饰的奥秘
  • 视频剪辑SDK定制开发技术方案与报价书优雅草卓伊凡
  • pinia状态管理使用
  • 星际旅行家(广度优先搜索+邻接表)
  • 直流电机 pwm 调速
  • 第五十一节:增强现实基础-单应性矩阵计算
  • MySQL#Select语句执行过程