更新时间:2026-07-03 GMT+08:00
分享

lag

功能描述

lag函数用于统计窗口内往上第n行值。

使用限制

窗口函数的使用限制如下:

  • 窗口函数只能出现在select语句中。
  • 窗口函数中不能嵌套使用窗口函数和聚合函数。
  • 窗口函数不能和同级别的聚合函数一起使用。

语法格式

lag(<expr>[, bigint <offset>[, <default>]]) over([partition_clause] orderby_clause)

参数说明

参数

是否必选

说明

expr

待计算返回结果的表达式。

offset

偏移量,BIGINT类型常量,取值大于等于0。值为0时表示当前行,为1时表示前一行,以此类推。默认值为1。输入值为STRING类型、DOUBLE类型则隐式转换为BIGINT类型后进行运算。

default

常量,默认值为NULL。当offset指定的范围越界时的缺省值,需要与expr对应的数据类型相同。如果expr非常量,则基于当前行进行求值。

partition_clause

指定分区。分区列的值相同的行被视为在同一个窗口内。

orderby_clause

指定数据在一个窗口内如何排序。

返回值说明

参数的数据类型。

示例

示例数据

为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下:

create table logs(
  cookieid string,
  createtime string,
  url string 
)  
STORED AS parquet; 

添加数据如下:

cookie1 2015-04-10 10:00:02 url2 
cookie1 2015-04-10 10:00:00 url1 
cookie1 2015-04-10 10:03:04 url3 
cookie1 2015-04-10 10:50:05 url6 
cookie1 2015-04-10 11:00:00 url7 
cookie1 2015-04-10 10:10:00 url4 
cookie1 2015-04-10 10:50:01 url5 
cookie2 2015-04-10 10:00:02 url22 
cookie2 2015-04-10 10:00:00 url11 
cookie2 2015-04-10 10:03:04 url33 
cookie2 2015-04-10 10:50:05 url66 
cookie2 2015-04-10 11:00:00 url77 
cookie2 2015-04-10 10:10:00 url44 
cookie2 2015-04-10 10:50:01 url55 

将所有记录根据cookieid分组,并按createtime升序排列,返回窗口内往上第2行的值。命令示例如下

示例1:

SELECT cookieid, createtime, url,
        LAG(createtime, 2) OVER (PARTITION BY cookieid ORDER BY createtime) AS last_2_time 
FROM logs; 
-- 返回结果: 
cookieid createtime         url  last_2_time 
cookie1 2015-04-10 10:00:00 url1 NULL 
cookie1 2015-04-10 10:00:02 url2 NULL 
cookie1 2015-04-10 10:03:04 url3 2015-04-10 10:00:00 
cookie1 2015-04-10 10:10:00 url4 2015-04-10 10:00:02 
cookie1 2015-04-10 10:50:01 url5 2015-04-10 10:03:04 
cookie1 2015-04-10 10:50:05 url6 2015-04-10 10:10:00 
cookie1 2015-04-10 11:00:00 url7 2015-04-10 10:50:01 
cookie2 2015-04-10 10:00:00 url11 NULL 
cookie2 2015-04-10 10:00:02 url22 NULL 
cookie2 2015-04-10 10:03:04 url33 2015-04-10 10:00:00 
cookie2 2015-04-10 10:10:00 url44 2015-04-10 10:00:02 
cookie2 2015-04-10 10:50:01 url55 2015-04-10 10:03:04 
cookie2 2015-04-10 10:50:05 url66 2015-04-10 10:10:00 
cookie2 2015-04-10 11:00:00 url77 2015-04-10 10:50:01 

说明:因为没有设置默认值,当没有上两行时显示为NULL。

示例2:

SELECT cookieid, createtime, url,
        LAG(createtime,1,'1970-01-01 00:00:00') OVER (PARTITION BY cookieid ORDER BY createtime) AS last_1_time 
FROM cookie4; 
-- 结果: 
cookieid createtime          url last_1_time cookie1 2015-04-10 10:00:00 url1 1970-01-01 00:00:00 (显示默认值) 
cookie1 2015-04-10 10:00:02 url2 2015-04-10 10:00:00 
cookie1 2015-04-10 10:03:04 url3 2015-04-10 10:00:02 
cookie1 2015-04-10 10:10:00 url4 2015-04-10 10:03:04 
cookie1 2015-04-10 10:50:01 url5 2015-04-10 10:10:00 
cookie1 2015-04-10 10:50:05 url6 2015-04-10 10:50:01 
cookie1 2015-04-10 11:00:00 url7 2015-04-10 10:50:05 
cookie2 2015-04-10 10:00:00 url11 1970-01-01 00:00:00 (显示默认值) 
cookie2 2015-04-10 10:00:02 url22 2015-04-10 10:00:00 
cookie2 2015-04-10 10:03:04 url33 2015-04-10 10:00:02 
cookie2 2015-04-10 10:10:00 url44 2015-04-10 10:03:04 
cookie2 2015-04-10 10:50:01 url55 2015-04-10 10:10:00 
cookie2 2015-04-10 10:50:05 url66 2015-04-10 10:50:01 
cookie2 2015-04-10 11:00:00 url77 2015-04-10 10:50:05 

相关文档