Hive 【Hive(七)窗口函数练习】

窗口函数案例

数据准备

1)建表语句

create table order_info
(order_id     string, --订单iduser_id      string, -- 用户iduser_name    string, -- 用户姓名order_date   string, -- 下单日期order_amount int     -- 订单金额
);

2)装载语句

insert overwrite table order_info
values ('1', '1001', '小元', '2022-01-01', '10'),('2', '1002', '小海', '2022-01-02', '15'),('3', '1001', '小元', '2022-02-03', '23'),('4', '1002', '小海', '2022-01-04', '29'),('5', '1001', '小元', '2022-01-05', '46'),('6', '1001', '小元', '2022-04-06', '42'),('7', '1002', '小海', '2022-01-07', '50'),('8', '1001', '小元', '2022-01-08', '50'),('9', '1003', '小辉', '2022-04-08', '62'),('10', '1003', '小辉', '2022-04-09', '62'),('11', '1004', '小猛', '2022-05-10', '12'),('12', '1003', '小辉', '2022-04-11', '75'),('13', '1004', '小猛', '2022-06-12', '80'),('14', '1003', '小辉', '2022-04-13', '94');

需求

1)统计每个用户截至每次下单的累积下单总额

这里使用基于行的窗口函数,起点是第一行,终点是当前行,并根据每个用户id分区,根据下单日期排序;因为需求是累计下单总额,所以窗口范围是从第一行到当前行。

-- 1)统计每个用户截至每次下单的累积下单总额
select user_id,user_name,order_id,order_date,order_amount,sum(order_amount) over(partition by user_id order by order_date rows between unbounded preceding and current row ) sum_amount
from order_info;

 运行结果:

2)统计每个用户截至每次下单的当月累积下单总额

这里使用了 substring 函数,它作为 partition by 后面的第二个字段,意味着先根据 user_id 分区之后再根据 日期的 1~7 位(也就是 年份-月份)进行分区,这样就巧妙的将每个用户不同的月份可以进行窗口函数的累计求和。

select user_id,user_name,order_id,order_date,order_amount,sum(order_amount) over(partition by user_id ,substring(order_date,1,7) order by order_date rows between unbounded preceding and current row ) sum_amount
from order_info

运行结果:

3)统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)

这里用到一个新的函数 datediff(),它是用来计算两个日期间隔的;这道题的核心在于使用 lag 函数来获取上一行的值 last_date,然后用 datediff 函数进行差值计算得到天数。

注意:lag 函数和 lead 函数是不需要声明窗口范围的。

-- 3)统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)
select user_id,user_name,order_id,order_date,order_amount,nvl(datediff(order_date,last_date),0) diff
from (selectorder_id,user_id,user_name,order_date,order_amount,lag(order_date,1,null) over(partition by user_id order by order_date) last_datefrom order_info)t1;

运行结果: 

4)查询所有下单记录以及每个用户的每个下单记录所在月份的首/末次下单日期

这里使用了 first_value 和 last_value 函数,同样分区规则是先根据 user_id 再根据 order_date 进行分区的,其中 last_value 需要声明窗口范围,我们取从第一行到最后一行;first_value 没有声明窗口范围,则会默认按照 基于列 的窗口函数 between unbounded preceding and current row,因为我们比较的是日期,所以即使每次移动窗口也都会取小于当前日期的值。

-- 4)查询所有下单记录以及每个用户的每个下单记录所在月份的首/末次下单日期
select user_id,user_name,order_id,order_date,order_amount,first_value(order_date,false) over (partition by user_id,substring(order_date,1,7) order by order_date) first_date,last_value(order_date,false) over (partition by user_id,substring(order_date,1,7) order by order_date rows between unbounded preceding and unbounded following) last_date
from order_info;

运行结果:

5)为每个用户的所有下单记录按照订单金额进行排名

这里使用 row_number() ,order by 是根据 order_amount 进行排序,排名的结果也是按照 order_amount 排名。 

-- 5)为每个用户的所有下单记录按照订单金额进行排名
select user_id,user_name,order_id,order_date,order_amount,row_number() over (partition by user_id order by order_amount) rank
from order_info;

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/126674.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】VR虚拟现实编辑软件的独特优势

随着科技的不断发展,虚拟现实(Virtual Reality,简称VR)技术已经成为了一种新兴的交互方式。由广州华锐互动研发的VR虚拟现实编辑软件,是一种用于创建虚拟现实内容的工具,它可以让用户在虚拟环境中自由地创作和体验各种内容。 VR虚…

渲染和不渲染有什么区别?原来三维渲染前后的差别真得很大!

在当今数字技术快速发展的时代,三维渲染成为了电影、游戏、建筑等领域中不可或缺的重要环节。无论是电影中绚丽的特效场景,还是游戏中逼真的虚拟世界,渲染技术都起到了至关重要的作用。那么渲染和不渲染,场景的差别到…

国庆假期作业day2

作业&#xff1a;创建一个双向链表&#xff0c;将26个英文字母通过头插的方式插入到链表中&#xff0c;通过尾删的方式将数据读取出来并删除 #ifndef _TEXT_H #define _TEXT_H #include<myhead.h> typedef int datatype; typedef struct dblist {union {datatype data;/…

大语言模型黑盒被打破;Meta 元宇宙硬件亏损可能高于市场共识丨 RTE 开发者日报 Vol.60

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…

cpp primer笔记110-面向对象程序设计

如果不想一个类被其他类继承&#xff0c;可以在定义的变量名后面加上final&#xff0c;这样如果其他类继承该类会报错。 class Base final {virtual void func(){std::cout << "Base" << std::endl;} }; /*class Son :public Base//报错 { };*/override…

36.骑士周游算法及其基于贪心算法的优化

概述 骑士周游算法&#xff0c;叫做“马踏棋盘算法”或许更加直观。在国际象棋8x8的棋盘中&#xff0c;马也是走“日字”进行移动&#xff0c;相应的产生了一个问题&#xff1a;“如果要求马 在每个方格只能进入一次&#xff0c;走遍全部的64个方格需要如何行进&#xff1f;”…

【C语言】编译和链接

前言&#xff1a; 编译和链接是计算机程序开发中的两个重要步骤&#xff0c;用于将源代码转化为可执行的程序。 文章目录 一、翻译环境和运行环境二、翻译环境中的编译2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 语法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编 三…

【RabbitMQ】初识消息队列 MQ,基于 Docker 部署 RabbitMQ,探索 RabbitMQ 基本使用,了解常见的消息类型

文章目录 前言一、初识消息队列 MQ1.1 同步通信1.2 异步通信1.3 MQ 常见框架及其对比 二、初识 RabbitMQ2.1 什么是 RabbitMQ2.2 RabbitMQ 的结构 三、基于 Docker 部署 RabbitMQ四、常见的消息类型五、示例&#xff1a;在 Java 代码中通过 RabbitMQ 发送消息5.1 消息发布者5.2…

吐血整理,最全Pytest自动化测试框架快速上手(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest框架 pyte…

【深蓝学院】手写VIO第2章--IMU传感器--作业

这次作业坑很多&#xff0c;作业说明的不清楚&#xff0c;摸索了很长时间才将此次作业完成&#xff0c;在这里进行记录。 1. T1 1.1 题干 1.2 解答 1.2.1 法1&#xff0c;ros related方法 不知道为什么我的launch不了&#xff0c;在imu_utils目录下面建立build后&#xff0…

头部品牌停业整顿,鲜花电商的中场战事迎来拐点?

鲜花电商行业再次迎来标志性事件&#xff0c;曾经4年接连斩获6轮融资的明星品牌花加&#xff0c;正式宣布停业整顿。 梳理来看&#xff0c;2015年是鲜花电商赛道的发展爆发期&#xff0c;彼时花加等品牌相继成立&#xff0c;并掀起一波投资热潮&#xff0c;据媒体统计&#xf…

一座“城池”:泡泡玛特主题乐园背后,IP梦想照亮现实

“更适合中国宝宝体质”的主题乐园&#xff0c;被泡泡玛特造出来了。 9月26日&#xff0c;位于北京朝阳公园内的国内首个潮玩行业沉浸式 IP 主题乐园&#xff0c;也是泡泡玛特首个线下乐园——泡泡玛特城市乐园 POP LAND正式开园。 约4万平方米的空间中&#xff0c;泡泡玛特使…