背景

我们知道clickhouse一般都是处理单表的数据,当获取lag(前一条),lead(后一条)记录等数据时,和spark可以通过表连接来获取不同,clickhouse需要灵活使用开窗函数获取

技术原理

假设我们有一张每个学生模拟考试分数的表,表定义如下:

create table studentScore(
timestamp DateTime,
name String,
score int32
)engine=MergeTree()
partition by name
order by timestamp

假设我们表中的其中一个同学的数据如下所示:

此刻,我们想要获取这个学生每次考试的前一个成绩记录和后一个成绩记录,应该怎么做呢?

select timestamp,name,score,order_num,reverse_order_num,lag,lead from
(select timestamp, name, score,
row_number() over (partition by name order by timestamp) as order_num,
row_number() over (partition by name order by timestamp desc) as reverse_order_num,
any(num) over (partition by name order by timestamp rows between 1 preceding and 1 preceding) as lag,
any(num) over (partition by name order by timestamp rows between 1 following and 1 following) as lead
from studentScore

使用row_number over以及rows between xx preceding and xx following开窗函数,我们就会得到以下的结果:

可以看到对于每条模拟考试记录,我们都能看到上一次模拟考试的记录和下一次模拟考试的记录,达到了获取同比环比记录的目的,不过大家可能还注意到一点,我们除了获取前一条模拟考试记录和下一次模拟考试的记录之外,我们还使用row_number over开窗函数额外记录了两列数据,其目的是通过这两列可以让我们区分第一条记录和最后一条记录,也就是每个学生第一次模拟考试记录和最后一次模拟考试记录,记录这个信息的作用是这样我们就可以区分哪一条记录是这个学生的第一次模拟考试记录,哪一条记录是这个学生的最后一次模拟考试记录,需要区分这两条特殊的记录是因为对于第一次模拟考试记录来说,它的前一次考试记录是不存在的,clickhouse这里用0代替,但是实际应用中我们可能需要区分这种情况,使用case when等区分处理第一次模拟考试和其他的模拟考试,同理,对于最后一次模拟考试记录来说,它的后一次考试记录是不存在的,clickhouse这里用0代替,但是实际应用中我们可能需要区分这种情况,使用case when等区分处理最后一次模拟考试和其他的模拟考试。有了这些信息,我们就可以获取每次模拟考试同比增加了多少分等数据了

参考文献:
https://blog.csdn.net/qq_42374697/article/details/115109386
https://blog.csdn.net/liuyingying0418/article/details/120269624

clickhouse开窗函数之同比环比相关推荐

  1. access month函数用法_掌握时间智能函数,同比环比各种比,轻松搞定!

    时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中可以用CALCULATE来写个度量值[上年同期], = CALCULATE( ...

  2. Clickhouse实战--开窗函数的使用(1)

    当我们需要求同比.环比,或则分组计算数据的最大值,最小值时,就需要用到窗口函数.Clickhouse也提供了很多的window函数.本文就来学习一下Clickhouse的window函数的使用. 官方 ...

  3. 7.6 PowerBI系列之DAX函数专题-周的同比环比与周聚合

    需求 实现如下图的周同比环比分析 实现 日期表 = -- 创建一个日期表 addcolumns(addcolumns(calendar auto(),"年度",year(date) ...

  4. excel中#N/A的解释同比环比基比画四象限图的小tips字符串截取函数substitute的深入理解

    分组分析,同比环比定基比,字符串截取等问题的总结 EXCEL中#N/A,是"不适用"的意思,多用在填写表格的时候,表示"本栏目(对我)不适用",在没有东西可填写 ...

  5. 异常检测方法——DBSCAN、孤立森林、OneClassSVM、LOF、同比环比、正态分布、箱线图

    异常检测方法 基于时间序列分析 同比环比 基于统计 单特征且符合正态分布 基于统计 箱线图 基于聚类 DBSCAN 基于树模型 孤立森林 基于线性模型 OneClassSVM 基于密度 LOF 异常检 ...

  6. 【Mysql实战】使用存储过程和计算同比环比

    背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...

  7. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  8. oracle 开窗子句,分析函数和开窗函数

    分析函数 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值 分析函数和聚合函数的区别 普通的 ...

  9. oracle之分析函数 开窗函数,Oracle之分析函数、开窗函数

    一.rank() over(partition by 字段1 order by 字段2) 从最经典的一个例子来说: 这是原始表结构: 现在需要增加一列,用来统计每天不同城市的完成率排名. 这意味着要对 ...

  10. Spark 开窗函数

    row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN 如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,H ...

最新文章

  1. 基于RBF简单的matlab手写识别
  2. java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )
  3. latex表插入的位置不对_VSCode_LaTex_英文amp;中文配置
  4. 安装配置java,tomcat,eclipse
  5. 高等数学张宇18讲 第十讲 多元函数微分学
  6. ffmpeg 将视频转换为图片
  7. MTSP问题遗传算法解决代码及其案例
  8. 路由器技术彻底解决路由器IP地址冲突问题
  9. 2019下半年计算机二级c语言,2019年下半年计算机二级C语言试题(4)
  10. Spring Boot资源获取失败:class path resource cannot be opened because it does not exist
  11. javaweb实现支付宝扫码支付完整流程
  12. 软考高级-系统架构师-案例分析-数据库真题考点汇总
  13. 智能设备系统的测试分析——语音识别系统和面部识别系统
  14. 产品经理全套入门学习资料,及各行业解析分享
  15. iptable使用笔记
  16. Rsync守护进程部署和实践
  17. 计算机DVD驱动禁用怎么恢复,Win7系统禁用或隐藏DVD光驱设备的方法
  18. [转载]ExtJs4 笔记(10) Ext.tab.Panel 选项卡
  19. Supervisor 进程管理
  20. Airtest(poco)使用注意事项以及遇到的坑:adb下载安装、poco不显示渲染树

热门文章

  1. 学python要有多少英语词汇量_英文总共20万个词汇量!学好英文,到底要背多少单词才够用?...
  2. oracle 时间毫秒数,计算Oracle中两个时间戳之差(以毫秒为单位)
  3. python掷骰子实验代码_Python Tkinter实例——模拟掷骰子
  4. YOLO系列目标检测数据集大全
  5. COSTDOWN Project's BSP(二)
  6. 用Android-X86和VirtualBox打造高性能Android开发环境
  7. JavaWeb学习笔记之——Servlet HTTP Request
  8. 用qq来搞定gmail,yahoo,hotmail,126 邮箱 POP3协议
  9. The SDK seems invalid 问题处理
  10. Python中Print()函数的用法___实例详解(全,例多)