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 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...