clickhouse中的lead和lag实现有多种方法,在标准的SQL中使用的windows function即可实现。

示例数据:
CREATE TABLE llexample (g Int32,a Date )
ENGINE = Memory;INSERT INTO llexample SELECTnumber % 3,toDate('2020-01-01') + number
FROM numbers(10);SELECT * FROM llexample ORDER BY g,a;┌─g─┬──────────a─┐
│ 0 │ 2020-01-01 │
│ 0 │ 2020-01-04 │
│ 0 │ 2020-01-07 │
│ 0 │ 2020-01-10 │
│ 1 │ 2020-01-02 │
│ 1 │ 2020-01-05 │
│ 1 │ 2020-01-08 │
│ 2 │ 2020-01-03 │
│ 2 │ 2020-01-06 │
│ 2 │ 2020-01-09 │
└───┴────────────┘方法1:array
select g, (arrayJoin(tuple_ll) as ll).1 a, ll.2 prev, ll.3 next
from (
select g, arrayMap( i,j,k -> (i,j,k), arraySort(groupArray(a)) as aa, arrayPopBack(arrayPushFront(aa, toDate(0))),arrayPopFront(arrayPushBack(aa, toDate(0))) ) tuple_ll
from llexample
group by g)
order by g, a;┌─g─┬──────────a─┬───────prev─┬───────next─┐
│ 0 │ 2020-01-01 │ 1970-01-01 │ 2020-01-04 │
│ 0 │ 2020-01-04 │ 2020-01-01 │ 2020-01-07 │
│ 0 │ 2020-01-07 │ 2020-01-04 │ 2020-01-10 │
│ 0 │ 2020-01-10 │ 2020-01-07 │ 1970-01-01 │
│ 1 │ 2020-01-02 │ 1970-01-01 │ 2020-01-05 │
│ 1 │ 2020-01-05 │ 2020-01-02 │ 2020-01-08 │
│ 1 │ 2020-01-08 │ 2020-01-05 │ 1970-01-01 │
│ 2 │ 2020-01-03 │ 1970-01-01 │ 2020-01-06 │
│ 2 │ 2020-01-06 │ 2020-01-03 │ 2020-01-09 │
│ 2 │ 2020-01-09 │ 2020-01-06 │ 1970-01-01 │
└───┴────────────┴────────────┴────────────┘方法2:Using window functions (starting from Clickhouse 21.3)
SET allow_experimental_window_functions = 1;SELECTg,a,any(a) OVER (PARTITION BY g ORDER BY a ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev,any(a) OVER (PARTITION BY g ORDER BY a ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next
FROM llexample
ORDER BYg ASC,a ASC;┌─g─┬──────────a─┬───────prev─┬───────next─┐
│ 0 │ 2020-01-01 │ 1970-01-01 │ 2020-01-04 │
│ 0 │ 2020-01-04 │ 2020-01-01 │ 2020-01-07 │
│ 0 │ 2020-01-07 │ 2020-01-04 │ 2020-01-10 │
│ 0 │ 2020-01-10 │ 2020-01-07 │ 1970-01-01 │
│ 1 │ 2020-01-02 │ 1970-01-01 │ 2020-01-05 │
│ 1 │ 2020-01-05 │ 2020-01-02 │ 2020-01-08 │
│ 1 │ 2020-01-08 │ 2020-01-05 │ 1970-01-01 │
│ 2 │ 2020-01-03 │ 1970-01-01 │ 2020-01-06 │
│ 2 │ 2020-01-06 │ 2020-01-03 │ 2020-01-09 │
│ 2 │ 2020-01-09 │ 2020-01-06 │ 1970-01-01 │
└───┴────────────┴────────────┴────────────┘方法3:Using lagInFrame/leadInFrame (starting from ClickHouse 21.4)SELECTg,a,lagInFrame(a) OVER (PARTITION BY g ORDER BY a ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS prev,leadInFrame(a) OVER (PARTITION BY g ORDER BY a ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS next
FROM llexample
ORDER BYg ASC,a ASC;┌─g─┬──────────a─┬───────prev─┬───────next─┐
│ 0 │ 2020-01-01 │ 1970-01-01 │ 2020-01-04 │
│ 0 │ 2020-01-04 │ 2020-01-01 │ 2020-01-07 │
│ 0 │ 2020-01-07 │ 2020-01-04 │ 2020-01-10 │
│ 0 │ 2020-01-10 │ 2020-01-07 │ 1970-01-01 │
│ 1 │ 2020-01-02 │ 1970-01-01 │ 2020-01-05 │
│ 1 │ 2020-01-05 │ 2020-01-02 │ 2020-01-08 │
│ 1 │ 2020-01-08 │ 2020-01-05 │ 1970-01-01 │
│ 2 │ 2020-01-03 │ 1970-01-01 │ 2020-01-06 │
│ 2 │ 2020-01-06 │ 2020-01-03 │ 2020-01-09 │
│ 2 │ 2020-01-09 │ 2020-01-06 │ 1970-01-01 │
└───┴────────────┴────────────┴────────────┘方法4:Using neighbor (no grouping, incorrect result over blocks)
SELECTg,a,neighbor(a, -1) AS prev,neighbor(a, 1) AS next
FROM
(SELECT *FROM llexampleORDER BYg ASC,a ASC
);┌─g─┬──────────a─┬───────prev─┬───────next─┐
│ 0 │ 2020-01-01 │ 1970-01-01 │ 2020-01-04 │
│ 0 │ 2020-01-04 │ 2020-01-01 │ 2020-01-07 │
│ 0 │ 2020-01-07 │ 2020-01-04 │ 2020-01-10 │
│ 0 │ 2020-01-10 │ 2020-01-07 │ 2020-01-02 │
│ 1 │ 2020-01-02 │ 2020-01-10 │ 2020-01-05 │
│ 1 │ 2020-01-05 │ 2020-01-02 │ 2020-01-08 │
│ 1 │ 2020-01-08 │ 2020-01-05 │ 2020-01-03 │
│ 2 │ 2020-01-03 │ 2020-01-08 │ 2020-01-06 │
│ 2 │ 2020-01-06 │ 2020-01-03 │ 2020-01-09 │
│ 2 │ 2020-01-09 │ 2020-01-06 │ 1970-01-01 │
└───┴────────────┴────────────┴────────────┘

参考:

https://kb.altinity.com/altinity-kb-queries-and-syntax/lag-lead

clickhouse lag/lead相关推荐

  1. oracle lag()_lead(),ORACLE中lag() lead()函数使用

    链接:http://www.xifenfei.com/784.html 标题:lag() lead()函数使用 作者:惜分飞版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] 1 ...

  2. hive 开窗函数之lag,lead,first_value,last_value

    概念 测试数据 -- 数据准备: 姓名,购买日期,购买数量 saml 2018-01-01 10 saml 2018-01-08 55 tony 2018-01-07 50 saml 2018-01- ...

  3. mssql sqlserver 分析函数lag lead使用说明及简介

    下文讲述sqlserver 2012中 lag.lead分析函数的用法及简介 实验环境: sqlserver 2012 lag.lead: 可以不通过联结的形式获取上下相邻(指定偏移量)行的指定列的数 ...

  4. hive的 LAG,LEAD,FIRST_VALUE,LAST_VALUE函数

    1.数据准备 CREATE EXTERNAL TABLE lxw1234 ( cookieid string, createtime string, --页面访问时间 url STRING --被访问 ...

  5. oracle下lag和lead分析函数

    Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率. 语法: [sql ...

  6. Oracle 取第一个、最后一个和上一个、下一个函数详解(first_value、last_value 和 lag、lead)

    文章目录 1 概述 2 示例 2.1 first_value() + last_value() 2.2 lag() + lead() 3 扩展 3.1 保持排序,且避免返回多行 keep() 1 概述 ...

  7. 【无标题】lead与lag函数

    lag与lead函数是跟偏移量相关的两个分析函数 通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤 该操作可代替表 ...

  8. ClickHouse技术分享第二弹(英文讲义)

    前言 以下是今天为公司小伙伴们做的ClickHouse技术分享的讲义.由于PPT太难做了,索性直接用Markdown来写,搭配Chrome上的Markdown Preview Plus插件来渲染,效果 ...

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

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

最新文章

  1. html图片缩放6,四款css 图片按比例缩放实例(兼容ie6,7,firefox)
  2. JavaScript 笔记(2) -- 类型转换 正则表达 变量提升 表单验证
  3. 访问IIS元数据库失败
  4. 芯片巨头为何痴恋开源软件?英特尔Imad Sousou来解密
  5. 面向对象编程(OOP)和面向过程编程
  6. 计算机一级汉字录入在线联系,计算机一级考试指导:汉字录入题的操作
  7. java 数组遍历_Java中遍历数组使用foreach循环还是for循环?
  8. Android录制和播放PCM数据
  9. I/0口输入输出实验 学习IO口的位操作方法,分别选择P0、P1、P2、P3端口中的某一位,该位作为输出使用,连接一只发光二极管,控制器闪烁。
  10. 华为招聘公关总监:接触近10位路透资深记者 年薪高达20万美元
  11. python 修改文件属性 macos_Python中用MacFSEvents模块监视MacOS文件系统改变一例
  12. python系统下载-pythonox下载
  13. IIS上部署网站问题总结
  14. STM32基于TFTP固件升级经验分享
  15. google浏览器安装gliffy 安装方法及插件
  16. u3d 100道面试题(包含答案)
  17. 计算机内存错误 要降频,电脑出现内存自动降频的问题该怎么办?
  18. 非线性规划与KTT(一)
  19. FontAwesome for Axure字体图标合集 v4.7 — v5.8 含Free版和Pro版
  20. Linux 压缩/解压工具

热门文章

  1. Visual Studio2019自定义项目模板
  2. 好书推荐--《人生不设限》
  3. 纳豆红曲胶囊价格作用怎么样!
  4. EasyExcel的导入和导出
  5. ISAM2.h/ISAM2.cpp
  6. 斗破苍穹模拟器显示服务器人满,斗破苍穹手游服务器达到上限不能创建角色原因及解决方法...
  7. 【ArcGIS教程】专题图制作之人口地图——湖北省人口密度分析
  8. 两个实打实干活的同事离职了,老板连谈都没谈,一句挽留都没有,你怎么看?
  9. 如何通过OPENROWSET函数向SQL Server导入带工作组(mdw)保护的Access数据库数据(转)...
  10. 【GP6安装配置】 Greenplum6.2.1 安装手记(下)