SQL窗口分析函数使用详解系列三之偏移量类窗口函数
1.综述
本文以HiveSQL语法进行代码演示。
对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。
已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类
本节介绍Hive窗口分析函数中的第三类窗口函数:偏移量类窗口函数。
在实际的应用场景中,顾名思义,偏移量分析函数主要应用于求解和指定偏移数据的差值。例如和上一行数据差值,和下一行数据差值。
有什么实际意义呢?例如,每行数据是天粒度的,那么上下行的差值计算就是前后天的数据增长量或者减少量,比left join,right join的方式更为简单,效率更高。
1.1 偏移量类窗口函数
lead() over();
lag() over();
first_value() over();
1.2 窗口函数语法
分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)
具体解析
over()括号内为空时,是直接进行计算。
其中partition by 列名 是按指定列进行分组,进而进行计算。
最后的order by 列名 是按照指定列进行排序,进而进行计算。
1.3 基础数据准备
create table if not exists temp.user_info (
`id` bigint comment '用户id',
`client` string comment '客户端',
`gender` int comment '性别,0女1男',
`constellation` string comment '星座',
`age` int comment '年龄',
`pv` bigint comment '访问量',
`chat_num` bigint comment '聊天次数'
) comment '用户信息测试临时表'
数据预览
| id | client | gender | constellation | age | pv | chat_num |
|---|---|---|---|---|---|---|
| 1 | ios | 0 | 处女座 | 29 | 174 | 3 |
| 2 | ios | 1 | 双鱼座 | 26 | 263 | 2 |
| 3 | android | 1 | 双鱼座 | 35 | 232 | 39 |
| 4 | ios | 1 | 水瓶座 | 32 | 57 | 3 |
| 5 | ios | 1 | 射手座 | 33 | 67 | 6 |
| 6 | ios | 1 | 双子座 | 36 | 81 | 5 |
| 7 | ios | 1 | 狮子座 | 29 | 68 | 4 |
| 8 | ios | 1 | 狮子座 | 28 | 19 | 3 |
| 9 | ios | 0 | 射手座 | 32 | 479 | 2 |
| 10 | ios | 1 | 白羊座 | 26 | 255 | 36 |
2.各偏移量函数的使用
2.1 lag
- 功能
Lag函数用于获取指定列的前n(取决于偏移量的设置)个行的值,按照我们设定的分区以及排序规则。
- 语法
lag(column_name, offset, default_value) over (partition by partition_col order by order_col)
① column_name要查询的列名
② offset 要查找的偏移量,即要获取的行数的偏移量,默认为1,例如往前1行或者n行。
③ default_value 一个可选的默认值(当没有找到前一个行时返回的值)
- 示例
按客户端分组,按id排序,取出上一行的年龄。
select id,client,age,lag(age,1,10) over(partition by client order by id) as lag_1_age from temp.user_info
where id <= 10
order by id;
数据结果
| id | client | age | lag_1_age |
|---|---|---|---|
| 1 | ios | 29 | 10 |
| 2 | ios | 26 | 29 |
| 3 | android | 35 | 10 |
| 4 | ios | 32 | 26 |
| 5 | ios | 33 | 32 |
| 6 | ios | 36 | 33 |
| 7 | ios | 29 | 36 |
| 8 | ios | 28 | 29 |
| 9 | ios | 32 | 28 |
| 10 | ios | 26 | 32 |
可以看到id为1的用户没有上一行,所以取到的值为我设置的默认值10.如果不设置默认值,返回null
Id 为2的用户渠道的偏移值是id为1的用户的年龄。
- 拓展使用
偏移量最常见的使用是当数据最细粒度为天粒度时,查询该用户的前一天行为和今天行为的差值或者相比上一日上涨或者下降百分比等。伪SQL
-- 这里省略了偏移量和默认值
select id,pv,dt,pv-lag_pv as gap_pv -- 当日和上一日的pv差值
from (
select id,pv,dt,lag(pv) over(partition by id order by dt) as lag_pv from temp.user_pv_info
) a
2.2 lead
- 功能
和lag类似,却刚好相反。是取向下的偏移量的值。进而进行差值计算等。
用于获取指定列的后n(取决于偏移量的设置)个行的值,按照我们设定的分区以及排序规则。
- 语法
lead(column_name, offset, default_value) over (partition by partition_col order by order_col)
① column_name要查询的列名
② offset 要查找的偏移量,即要获取的行数的偏移量,默认为1,例如往前1行或者n行。
③ default_value 一个可选的默认值(当没有找到前一个行时返回的值)
- 示例
按客户端分组,按id排序,取出下二行的年龄。
select id,client,age,lead(age,2,10) over(partition by client order by id) as lead_2_age from temp.user_info
where id <= 10
order by id;
数据结果
| id | client | age | lead_2_age |
|---|---|---|---|
| 1 | ios | 29 | 32 |
| 2 | ios | 26 | 33 |
| 3 | android | 35 | 10 |
| 4 | ios | 32 | 36 |
| 5 | ios | 33 | 29 |
| 6 | ios | 36 | 28 |
| 7 | ios | 29 | 32 |
| 8 | ios | 28 | 26 |
| 9 | ios | 32 | 10 |
| 10 | ios | 26 | 10 |
如上,我把偏移量设置为2,可以看到id为9和10的向下两行没有数据。
- 拓展使用
和lag使用场景一致,很多场景lag和lead都可以互换,需要设置排序是正序或者倒序的区别。
2.3 first_value
- 功能
first_value用于返回分组中的第一个值,按指定的排序列。我们在使用中可以根据特定的排序规则来确定和查询获取每个分组的第一个值。
- 语法
first_value(expression) over(
[partition by 列名1,列名2]
[order by 列名3,列名4]
)
① expression要获取第一个值的列或者表达式
② partition by 用于指定分组的列
③ order by 用于指定排序的列
- 示例
查询不同客户端,年龄最小的用户。
select id,client,age,first_value(age) over(partition by client order by age) as min_age from temp.user_info
where id <= 10
order by id;
数据结果
| id | client | age | min_age |
|---|---|---|---|
| 1 | ios | 29 | 26 |
| 2 | ios | 26 | 26 |
| 3 | android | 35 | 35 |
| 4 | ios | 32 | 26 |
| 5 | ios | 33 | 26 |
| 6 | ios | 36 | 26 |
| 7 | ios | 29 | 26 |
| 8 | ios | 28 | 26 |
| 9 | ios | 32 | 26 |
| 10 | ios | 26 | 26 |
可以看到当前ios客户端的最小年龄为26,android客户端最小年龄为35.
- 拓展使用
这样查有什么用呢?
例如可以进一步求解当前用户年龄和最小年龄或者最大年龄的差值。
如果是其他例如销售数据,或者活跃数据等,就更加有实用意义了。
总之,SQL窗口分析函数能够支持我们在更多的场景直接进行数据处理,进而更加深入和高效的进行数据分析。
以上,关于SQL窗口函数的三类就更完了。后续更多以SQL每日一题的方式体现。
感谢阅读。
下一期:还没想好。
按例,欢迎点击此处关注我的个人公众号,交流更多知识。
SQL窗口分析函数使用详解系列三之偏移量类窗口函数的更多相关文章
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- MyBatis的SQL语句映射文件详解(三)----多参数传递的几种方式
1.单一基本类型参数(String,int等) 单一的基本类型参数,将对应语句中的parameterType的值与参数的类型相同.然后直接 用“#{参数名}” 来获取 java代码 //String类 ...
- Eureka详解系列(三)--探索Eureka强大的配置体系
简介 通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何适用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部分后面再补充. ...
- 源码详解系列(七) ------ 全面讲解logback的使用和源码
什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...
- Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节
简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...
- Java源码详解系列(十)--全面分析mybatis的使用、源码和代码生成器(总计5篇博客)
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- 干货 | BitSail Connector 开发详解系列一:Source
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 BitSail 是字节跳动自研的数据集成产品,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全 ...
- Eureka详解系列(四)--Eureka Client部分的源码和配置
简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...
- Eureka详解系列(五)--Eureka Server部分的源码和配置
简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...
随机推荐
- 聊聊ShareGPT格式的微调数据集
转载请注明住处:https://www.cnblogs.com/zhiyong-ITNote 概述 ShareGPT格式的数据集中,一般是如下格式: [ { "conversations&q ...
- golang gc的内部优化
今天讲一个常见的gc compiler(也就是官方版本的go编译器和runtime)在垃圾回收的扫描标记阶段做的优化. 我对这个优化的描述印象最深的是在bigcache的注释里,大致内容是如果map的 ...
- CentOS 7 上搭建nginx来部署静态网页
目录 0. Nginx简介 1. 安装以及使用 1.1 安装和启动 1.2 配置服务器的访问地址 1.3 重启nginx,打开浏览器访问 0. Nginx简介 Nginx (engine x) 是一个 ...
- [HAOI2007,P2216,BZOJ1047]理想的正方形单调队列解法
题目描述 有一个 \(a \times b\) 的整数组成的矩阵,现请你从中找出一个 \(n \times n\) 的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入格式 第一行为 \( ...
- 2. Solving Linear Equations
2.1 Linear Equations Picture Row Picture 2 by 2 equations Two equations, Two unknowns \[\begin{matri ...
- Git 12 IDEA上传本地项目到远程
这里以上传 Spring 开源项目到 Gitee 为例: 1.点击 Create Git Repository 2.选择项目目录 3.添加到缓存库 4.提交到本地库 5.复制远程库地址 6.推送到远程 ...
- openGauss/MogDB调用C FUNCTION
openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现,通过 contrib 模块进行扩展的帖子,今天和恩墨工程师进行了一些交流,在 M ...
- HarmonyOS自定义抽奖转盘开发(ArkTS)
介绍 本篇Codelab是基于画布组件.显式动画,实现的一个自定义抽奖圆形转盘.包含如下功能: 1. 通过画布组件Canvas,画出抽奖圆形转盘. 2. 通过显式动画启动抽奖功能. 3. 通 ...
- sql 语句系列(行与列处理)[八百章之第一章]
排序时对null进行处理 比如说: select * from EMP order by COMM 我需要对红框部分进行desc处理,也就是从大到小排列. 解析: 重点是如何让null独立出去. se ...
- Elasticsearch数据同步优化
Elasticsearch数据同步优化 背景 为了满足项目需求,需要将大量数据的数据写入到ES进行检索,预估数据量是40亿左右,目前需要同步进去的是2亿左右. ES集群配置 三台128G的国产服务器 ...