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 ...
随机推荐
- 【已失效】Xcode GUI 添加 SPM 依赖的时候访问不了 github,无视 git config proxy 配置解决方案
此 openradar 中提出者指出了原因:Xcode 调用 libgit2 时传入了 GIT_PROXY_NONE,无视了 git config 中的 proxy 配置.作者说用了自己打的 libg ...
- VS2010插件NuGet
下载地址 NuGet Package Manager - Visual Studio Marketplace NuGet包地址 NuGet Gallery | Home
- X-Y问题
什么是X-Y问题 X-Y问题就是有人想解决问题X,他觉得Y可能是解决X的方法但不知道Y怎么做:在我们的工作中,需求方给出的来的是Y,而软件工程师不知道需要解决的X是什么. 我理解的X-Y问题是没有找到 ...
- KingbaseES V8R6集群运维案例--主库PITR恢复后备库无法连接到集群
案例说明: KingbaseES V8R6集群,在主库执行PITR恢复后,clone备库:但是启动集群后,备库无法连接到主库,流复制状态和集群节点状态异常. 适用版本: KingbaseES V8R6 ...
- 考PMP证书总结
备考时间轴 大概时间安排如下,有点佩服自己报考时的勇气,万万没想工作项目的里程碑是12月4号,和考试日期12月5号如此接近 慧翔天地这个培训机构真心不看好,自己的感觉就是没有学到什么东西吧.主讲彭是给 ...
- #Splay#U137476 序列
题目 给定长度为\(n\)的序列\(Ai\) ,我们将按照如下操作给\(Ai\) 排序, 先找到编号最小的所在位置\(x1\) ,将\([1,x1]\) 翻转, 再找到编号第二小的所在位置\(x2\) ...
- CMake vs Makefile 如何选择适合你的项目构建工具
CMake vs Makefile: 如何选择适合你的项目构建工具 在软件开发中,构建(build)是一个非常重要的过程.我们需要将源代码转换为可执行文件或库文件.为了完成此过程,我们通常使用构建工具 ...
- RabbitMQ 09 主题模式
主题模式 主题模式结构图: 主题模式实际上就是一种模糊匹配的模式,可以将routingKey以模糊匹配的方式去进行转发. 可以使用*或#来表示: *:任意的一个单词. #:0个或多个单词. 定义配置类 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —IAP Kit
1.问题描述 根据https://developer.huawei.com/consumer/cn/doc/harmonyos-references/iap-data-model-0000001736 ...
- 深入解析C++的auto自动类型推导
关键字auto在C++98中的语义是定义一个自动生命周期的变量,但因为定义的变量默认就是自动变量,因此这个关键字几乎没有人使用.于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变 ...