Hive数仓操作(十五)
Hive 开窗函数
Hive窗口函数是一种特殊的函数,允许用户在查询中对一组行进行计算,而不仅仅是单独的行。窗口函数可以在 SQL 查询中进行聚合、排名、累积计算等。这使得窗口函数在数据分析和报告生成中非常有用。
窗口函数的基本组成部分
- 函数类型:如
ROW_NUMBER()
,RANK()
,DENSE_RANK()
,SUM()
,AVG()
等。 - OVER 子句:定义窗口的范围和分区,用于指定在哪些行上应用窗口函数。
窗口边界标识符
-
CURRENT ROW:
- 表示窗口的当前行。通常用于窗口的结束范围。
-
n PRECEDING:
- 表示当前行之前的n行。例如,
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
表示从当前行向上看一行到当前行。
- 表示当前行之前的n行。例如,
-
n FOLLOWING:
- 表示当前行之后的n行。例如,
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
表示从当前行到当前行的后两行。
- 表示当前行之后的n行。例如,
-
UNBOUNDED:
- 表示没有边界,通常用于定义窗口的起点或终点。
-
UNBOUNDED PRECEDING:
- 表示从窗口的起点开始,不限行数。
-
UNBOUNDED FOLLOWING:
- 表示到窗口的终点结束,不限行数。
窗口边界函数
-
LAG(col, n):
- 这个函数用于获取当前行的前n行中的指定列的值。它可以用于比较当前行与前几行的数据。
SELECT employee_id, salary, LAG(salary, 1) OVER (ORDER BY employee_id) AS previous_salary FROM employees;
这个示例显示了每个员工的当前工资和前一个员工的工资。
-
LEAD(col, n):
- 这个函数用于获取当前行的后n行中的指定列的值。与
LAG
类似,但它是向下查找。
SELECT employee_id, salary, LEAD(salary, 1) OVER (ORDER BY employee_id) AS next_salary FROM employees;
这个示例显示了每个员工的当前工资和下一个员工的工资。
- 这个函数用于获取当前行的后n行中的指定列的值。与
示例数据集
假设我们有一个名为 business
的表,内容如下:
name | orderdate | cost |
---|---|---|
Alice | 2017-04-01 | 100 |
Bob | 2017-04-05 | 150 |
Alice | 2017-04-10 | 200 |
Charlie | 2017-05-01 | 300 |
Bob | 2017-05-10 | 100 |
Alice | 2017-05-15 | 250 |
Charlie | 2017-06-01 | 400 |
SQL 查询运行结果
1. 查询在2017年4月份购买过的顾客及总人数
SELECT name, COUNT(*) OVER()
FROM business
WHERE SUBSTRING(orderdate, 1, 7) = '2017-04';
结果:
name | COUNT(*) |
---|---|
Alice | 3 |
Bob | 3 |
Alice | 3 |
2. 查询顾客的购买明细及月购买总额
顾客购买明细及购买总额:
SELECT name, orderdate, cost, SUM(cost) OVER()
FROM business;
结果:
name | orderdate | cost | SUM(cost) |
---|---|---|---|
Alice | 2017-04-01 | 100 | 1300 |
Bob | 2017-04-05 | 150 | 1300 |
Alice | 2017-04-10 | 200 | 1300 |
Charlie | 2017-05-01 | 300 | 1300 |
Bob | 2017-05-10 | 100 | 1300 |
Alice | 2017-05-15 | 250 | 1300 |
Charlie | 2017-06-01 | 400 | 1300 |
明细及月购买总额:
SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY MONTH(orderdate))
FROM business;
结果:
name | orderdate | cost | SUM(cost) |
---|---|---|---|
Alice | 2017-04-01 | 100 | 300 |
Bob | 2017-04-05 | 150 | 300 |
Alice | 2017-04-10 | 200 | 300 |
Charlie | 2017-05-01 | 300 | 700 |
Bob | 2017-05-10 | 100 | 700 |
Alice | 2017-05-15 | 250 | 700 |
Charlie | 2017-06-01 | 400 | 400 |
顾客购买明细及顾客购买总额:
SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY name)
FROM business;
结果:
name | orderdate | cost | SUM(cost) |
---|---|---|---|
Alice | 2017-04-01 | 100 | 550 |
Bob | 2017-04-05 | 150 | 250 |
Alice | 2017-04-10 | 200 | 550 |
Charlie | 2017-05-01 | 300 | 700 |
Bob | 2017-05-10 | 100 | 250 |
Alice | 2017-05-15 | 250 | 550 |
Charlie | 2017-06-01 | 400 | 400 |
顾客购买明细及顾客月购买总额:
SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY name, MONTH(orderdate))
FROM business;
结果:
name | orderdate | cost | SUM(cost) |
---|---|---|---|
Alice | 2017-04-01 | 100 | 300 |
Bob | 2017-04-05 | 150 | 150 |
Alice | 2017-04-10 | 200 | 300 |
Charlie | 2017-05-01 | 300 | 300 |
Bob | 2017-05-10 | 100 | 100 |
Alice | 2017-05-15 | 250 | 250 |
Charlie | 2017-06-01 | 400 | 400 |
3. 按照日期进行累加
按照日期逐步累加购买总额
SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate)
FROM business;
方法2(边界从起点到当前行):
SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sample4
FROM business;
结果:
name | orderdate | cost | SUM(cost) |
---|---|---|---|
Alice | 2017-04-01 | 100 | 100 |
Alice | 2017-04-10 | 200 | 300 |
Alice | 2017-05-15 | 250 | 550 |
Bob | 2017-04-05 | 150 | 150 |
Bob | 2017-05-10 | 100 | 250 |
Charlie | 2017-05-01 | 300 | 300 |
Charlie | 2017-06-01 | 400 | 700 |
当前行和前面一行的聚合:
SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS sample5
FROM business;
结果:
name | orderdate | cost | sample5 |
---|---|---|---|
Alice | 2017-04-01 | 100 | 100 |
Alice | 2017-04-10 | 200 | 300 |
Alice | 2017-05-15 | 250 | 450 |
Bob | 2017-04-05 | 150 | 150 |
Bob | 2017-05-10 | 100 | 250 |
Charlie | 2017-05-01 | 300 | 300 |
Charlie | 2017-06-01 | 400 | 400 |
当前行和前后各一行的聚合:
SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sample6
FROM business;
结果:
name | orderdate | cost | sample6 |
---|---|---|---|
Alice | 2017-04-01 | 100 | 300 |
Alice | 2017-04-10 | 200 | 550 |
Alice | 2017-05-15 | 250 | 250 |
Bob | 2017-04-05 | 150 | 250 |
Bob | 2017-05-10 | 100 | 100 |
Charlie | 2017-05-01 | 300 | 700 |
Charlie | 2017-06-01 | 400 | 400 |
当前行及后面所有行:
SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS sample7
FROM business;
结果:
name | orderdate | cost | sample7 |
---|---|---|---|
Alice | 2017-04-01 | 100 | 550 |
Alice | 2017-04-10 | 200 | 250 |
Alice | 2017-05-15 | 250 | 250 |
Bob | 2017-04-05 | 150 | 100 |
Bob | 2017-05-10 | 100 | 100 |
Charlie | 2017-05-01 | 300 | 400 |
Charlie | 2017-06-01 | 400 | 400 |
4. 查询顾客上次的购买时间
使用 LAG 函数:
SELECT name, orderdate, cost,
LAG(orderdate, 1) OVER(PARTITION BY name ORDER BY orderdate) AS last_purchase_date
FROM business;
结果:
name | orderdate | cost | last_purchase_date |
---|---|---|---|
Alice | 2017-04-01 | 100 | NULL |
Alice | 2017-04-10 | 200 | 2017-04-01 |
Alice | 2017-05-15 | 250 | 2017-04-10 |
Bob | 2017-04-05 | 150 | NULL |
Bob | 2017-05-10 | 100 | 2017-04-05 |
Charlie | 2017-05-01 | 300 | NULL |
Charlie | 2017-06-01 | 400 | 2017-05-01 |
相关文章:
Hive数仓操作(十五)
Hive 开窗函数 Hive窗口函数是一种特殊的函数,允许用户在查询中对一组行进行计算,而不仅仅是单独的行。窗口函数可以在 SQL 查询中进行聚合、排名、累积计算等。这使得窗口函数在数据分析和报告生成中非常有用。 窗口函数的基本组成部分 函数类型&…...

No.12 笔记 | 网络基础:ARP DNS TCP/IP与OSI模型
一、计算机网络:安全的基石 1. 网络的本质:数字世界的神经系统 定义:计算机的互联互通,实现资源共享和信息交换组成要素:发送者、接收者、介质、数据、协议(五大要素) 2. 网络架构࿱…...

OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 介绍基于STM32F407IGT6芯片在拓维信息 Niobe407 开发板上移植OpenH…...

简单易懂的springboot整合Camunda 7工作流入门教程
简单易懂的Spring Boot整合Camunda7入门教程 因为关于Spring Boot结合Camunda7的教程在网上比较少,而且很多都写得有点乱,很多概念写得太散乱,讲解不清晰,导致看不懂,本人通过研究学习之后就写出了这篇教学文档。 介…...

LabVIEW提高开发效率技巧----点阵图(XY Graph)
在LabVIEW开发中,点阵图(XY Graph) 是一种强大的工具,尤其适用于需要实时展示大量数据的场景。通过使用点阵图,开发人员能够将实时数据可视化,帮助用户更直观地分析数据变化。 1. 点阵图的优势 点阵图&…...
C++-匿名空间
匿名命名空间(anonymous namespace)是 C 中的一种特性,用于将符号(如变量、函数或类)限制在定义它们的源文件的作用域内。这意味着在该源文件外部,这些符号不可见,从而避免了命名冲突。 1. 定义…...

jdk的安装和环境变量配置
1.将从官网下载好的jdk放在自己想要放的位置,这里的位置是:E:\develop 2.新建一个文件夹用来放安装的jdk,将jdk安装的此目录,这里的位置是:E:\develop\jdk17 3.jdk安装好之后,点击jdk17目录,点…...
继承、Lambda、Objective-C和Swift
继承 东风系列导弹是镇国神器。东风41不是突然就造出来的,之前有很多种东风xx导弹,每种导弹都有自己的独特之处,相同之处都具备导弹基本特点。很多工厂有量产磨具的生产线,盖房子就图纸,建筑设计建设都有参考ÿ…...

设置服务器走本地代理
勾选: 然后: git clone https://github.com/rofl0r/proxychains-ng.git./configure --prefix/home/wangguisen/usr --sysconfdir/home/wangguisen/etcmakemake install# 在最后配置成本地代理地址 vim /home/wangguisen/etc/proxychains.confsocks4 17…...

刷题 -哈希
面试面试经典 150 题 - 哈希 383. 赎金信 - 一个哈希表搞定 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int hash[26] {0};for (auto& ch : magazine) {hash[ch - a];}for (auto& ch : ransomNote) {if (--hash[ch - a] < …...
React响应式修改数组和对象
在React中,响应式地修改数组数据是一个常见的需求,它涉及到状态(state)的管理和更新。React的状态是不可变的,这意味着你不能直接修改状态对象中的数组元素,而是需要创建一个新的数组来更新状态。下面将详细…...
cerbot https证书免费自动续期
1. 简介 cerbot是一个开源的数字证书生成平台,简单好用。下面我们来看下安装配置和使用。 cerbot有很多种安装方式,有源码安装、第三方发布版本、pip安装和snap安装,官方推荐使用snap安装。 2. snap安装 snap官方安装文档,Sna…...

嵌入式硬件设计
嵌入式硬件设计是指针对嵌入式系统(一种专用的计算机系统,通常嵌入到其他设备中)进行的硬件设计工作。嵌入式系统广泛应用于消费电子、工业控制、医疗设备、汽车电子、航空航天等领域。以下是嵌入式硬件设计的主要内容和步骤: 1.…...
2024.09.24 校招 实习 内推 面经
🛰️ :neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招 | 毫末智行2025届校园招聘正式启动 (内推) 校招 | 毫末智行2025届校园招聘正式启动 (内推) 2、校招 | 圭目机器人 2025 校…...

GIT安装及集成到IDEA中操作步骤
最近深感GIT使用技能太差,我只会些皮毛,还是得看官网,总结一下常用的操作方法吧。 GIT环境配置到IDEA中安装 一、GIt的基本的安装 这个不在这里赘述了,自己装一个git吧 二、给IDEA指定本地GIT的安装路径 1、下图这个是我本地的…...

Java使用线程池创建线程
一、线程前言 首先我们知道,线程的概念如果不知道可以去看这一篇Java中的线程,我们这篇主要讲述的是Java怎么使用线程池创建线程,首先我们要对线程池有点概念,其实顾名思义,线程池就是有喝多线程的一个池子类似于&…...

mysql UDF提权(实战案例)
作者:程序那点事儿 日期:2024/09/29 16:10 什么是UDF? 全称 User Define Function (用户自定义函数)UDF提权,就是通过自定义函数,实现执行系统的命令。 dll(windows,dll文件是c语…...

【瑞昱RTL8763E】刷屏
1 显示界面填充 用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述,表中的每个元素代表一 个显示元素,可以是背景、小图标、字符等,UI_WidgetTypeDef 结构体含义如下: typedef struct _UI_WidgetTypeDef …...

【黑马点评】使用RabbitMQ实现消息队列——3.使用Jmeter压力测试,导入批量token,测试异步秒杀下单
3 批量获取用户token,使用jmeter压力测试 3 批量获取用户token,使用jmeter压力测试3.1 需求3.2 实现3.2.1 环境配置3.2.2 修改登录接口UserController和实现类3.2.3 测试类 3.3 使用jmeter进行测试3.4 测试结果3.5 将用户登录逻辑修改回去 3 批量获取用户…...

第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC
21.1 事前准备 CREATE TABLE hero ( number INT, NAME VARCHAR ( 100 ), country VARCHAR ( 100 ), PRIMARY KEY ( number ) ) ENGINE INNODB CHARSET utf8;INSERT INTO hero VALUES ( 1, 刘备, 蜀 );21.2 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...