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 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
