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 ...
随机推荐
- 记录--实时音视频功能简析(live-pusher与live-player)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用须知 2017年下半年,微信6.5.21版本支持在线音视频功能.开发者可以通过两个音视频组件 和 实现实时地在线直播.视频通话.语音通 ...
- 从零开始学Spring Boot系列-集成Kafka
Kafka简介 Apache Kafka是一个开源的分布式流处理平台,由LinkedIn公司开发和维护,后来捐赠给了Apache软件基金会.Kafka主要用于构建实时数据管道和流应用.它类似于一个分布 ...
- 创建远程仓库&克隆项目(Github)
创建远程仓库 在GitHub上注册一个账号,之后creat a new repository 创建的远程仓库把它看作一个百度网盘就可以了 克隆项目 1.远程仓库可以下载\克隆到本地 code :git ...
- 关于FTP文件传输协议说明,带你了解更详情的文件传输协议
Internet和其他网络上的人与设备之间的通信使用协议进行.您可以说协议定义了对话规则:谁必须在何时发送哪些信息?如果数据没有到达接收者,会发生什么?您如何保护转帐免受错误和犯规?每当我们使用Int ...
- verilog之锁存器和触发器
verilog锁存器和触发器 1.基本概念 锁存,就是输入信号变化时,输出不发生变化时,就是触发器或者锁存器.触发器的敏感信号是clk,即触发器是知道被延时了多少.对于锁存器来说,延时是不确定的.一般 ...
- KingbaseES例程_普通表在线转分区表(基于触发器)
KingbaseES例程_普通表在线转分区表 概述 普通表转分区表,使用视图的替换式触发器,以路由方式,实现在线转移数据. 数据准备 /*普通大表*/ create table tab_single ...
- Java实现软件设计模式---抽象工厂模式(性别产品等级结构肤色产品族)
一.题目要求 二.画出对应的类图 三.文件目录结构 四.具体实现代码 Black.java 1 package com.a004; 2 3 public class Black implements ...
- Linux服务器程序规范化
Linux日志体系 rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志.用户进程是通过调用syslog函数生成系统日志的.该函数将日志输出到一个UNIX本地域socket类型(AF_ ...
- 5W1H聊开源之What——开源是什么?
美国政治传播学家拉斯韦尔提出了5W传播模式,经过后人的不断运用和发展总结,形成了一套逐渐成熟的"5W1H"体系,即:对选定的项目.工序或操作,都要从原因(何因Why).对象(何事W ...
- #裴蜀定理#洛谷 2520 [HAOI2011]向量
题目 分析 首先若 \(a,b\) 都为 0 要特判. 若 \(\begin{cases}x=pa+qb+p'a+q'b\\y=qa+pb-q'a-p'b\end{cases}\) 合并同类项可以得到 ...