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 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
