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.mzph.cn/news/95785.shtml

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

相关文章

一文搞懂APT攻击

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁(APT,Advanced Persistent Threat),又叫高级长期威胁,是一种复杂的、持续的网络攻击,包含高级、长期、威胁三个要素…

超声波气象站——环境监测领域强大助手

超声波气象站是环境监测领域的一位强大助手,超声波气象站是一种综合型的气象设备,精巧而全面,满足人们对环境状况的深入了解和精准把握。 首先,超声波气象站的传感器部分,是它的核心组成部分,这位“感知者”…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…

Elasticsearch数据操作原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性,可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

Linux 本地 Docker Registry本地镜像仓库远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)镜像,不受本地局域网限制! 1. 部署Docker Registry 使用官网安装方式,docker命令一键启动,该命令启动一个regis…

JVM-满老师

JVM 前言程序计数器,栈,虚拟机栈:本地方法栈:堆,方法区:堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件&#xff…

虫情测报灯如何实现自动化测报?

一、KH-CQPest虫情测报灯的工作过程 虫情测报灯是新一代的图像式虫情测报智能设备,在农业虫害防治领域拥有独特魅力,它内置高像素的摄像头,能够精准记录并将照片上传至智慧农业平台识别害虫的形态、种类。虫情测报灯运用现代光电数控集成技术…

Netty(四)NIO-优化与源码

Netty优化与源码 1. 优化 1.1 扩展序列化算法 序列化,反序列化主要用于消息正文的转换。 序列化:将java对象转为要传输对象(byte[]或json,最终都是byte[]) 反序列化:将正文还原成java对象。 //java自带的序列化 // 反序列化 b…

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

[unity]保存文件的路径设置

序 比如,序列化了一个数组,保存到磁盘上。 原来的路径是"D://test.bin",能跑,但是有点问题:序列化出来的文件和原项目离的太远,不好管理。 要是能保存到unity工程的文件夹里就好了。这个路径该…

学习记忆——方法篇——整除特点

理解记忆法 对于数的整除特征大家都比较熟悉:比如4看后两位(因为100是4的倍数),8看后三位(因为1000是8的倍数),5末尾是0或5,3与9看各位数字和等等,今天重点研究一下3,9,…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目,先看项目质量(有源码论文) 项目链接:医疗预约挂号平台git地址 演示视频:医疗预约挂号平台 功能结构图 登录注册模块:该模块具体分为登录和注册两个功能,这些…

小样本学习——匹配网络

目录 匹配网络 (1)简单介绍: (2)专业术语 (3)主要思想 (4)训练过程 问题 回答 MANN 匹配网络 (1)简单介绍: Matching netwo…

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处,何不把临时工作区升级改造为你的专属工作区呢,还能为这些至关重要的区域注入新的活力。 创造多用途的起居室:我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥:mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex:直接进行lock()或者unlock()递归互斥锁recursive_mutex:可以多次加锁,意味着加几次锁就需要解几次锁…

【C++】:类和对象(2)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

netcore Polly.Core

一、安装包 <PackageReference Include"Polly.Core" Version"8.0.0" /> 二、编写重试 ResiliencePipeline pipeline new ResiliencePipelineBuilder().AddRetry(new RetryStrategyOptions{MaxRetryAttempts 2,Delay TimeSpan.FromSeconds(3),O…

王杰国庆作业day6

服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <my_head.h> #define PORT 2324 //端口号 #define IP "192.168.10.107" //本机IP int main(int argc, const char *argv[]) {sqlite3* d…

【JavaEE】JUC(Java.util.concurrent)常见类

文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言 经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题&#xff0c;java.util.concurrent 是我们多线程编程的一个常用包&#xff0c;那么今天我将为大家分…

vue、vuex状态管理、vuex的核心概念state状态

每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store”基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&#xff1a; Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候&…