一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
前面介绍过窗口函数,主要是和聚合类函数一起搭配使用的,最近又新学了一种分析窗口函数,不同的是这种函数可以对数据进行统计分析,下面来重点介绍一下这种窗口函数的使用吧。
分析函数
1、在一次查询中取出同一个字段的前N行数据: lag()
常见使用方法:lag(col,n,default)
具体功能描述:此函数也是结合窗口函数作为分析数据只用,经常应用在一些偏移值统计的计算当中。
其中col表示需要获取的列,n表示偏移数量,如果n是1,则在当前行往上取1行的数据作为本行的数据,如果往上1行没有数据,则显示默认值,即default表达式所写的值,如果获取的值为null,也是会默认用这个值代替。
这里的stack()函数的用法,会在后面的文章详细介绍到,这里的作用大家只要知道是为了创建一张临时表即可。
with mytable as (
select stack( 4 ,
'TOM' , float ( 70 ), '2021-01-13' ,
'TOM' , float ( 80 ), '2021-03-13' ,
'TOM' , float ( 90 ), '2021-05-13' ,
'TOM' , float ( 100 ), '2021-07-13' ) as (account_name,age,date)
)
select
a.account_name
,a.age
,a.date
,lag(a.date, 2 ,a.date) over (partition by a.account_name order by a.age desc) next_date
from mytable a
这里我用到的默认值就是date这个字段,所以当第一和第二条数据没有取到往前第 2 行的数据时,就用了默认值,也就是当前行的date字段,第三和第四行的数据就是沿用的往前两行的date字段的值。如下输出结果:
2、在一次查询中取出同一个字段的后N行数据: lead()
常见使用方法:lead(col,n,default)
具体功能描述:这个函数和上面的lag()函数功能类似,只有一个地方不同,那就是lag()是往前n行去获取数据,lead()则是往后n行去获取数据,其他功能基本全部相同,没有什么差别。直接上案例吧。
with mytable as (
select stack( 4 ,
'Mary' , float ( 22 ), '2021-01-13' ,
'Mary' , float ( 33 ), '2021-03-14' ,
'Mary' , float ( 44 ), '2021-05-15' ,
'Mary' , float ( 55 ), '2021-07-16' ) as (account_name,age,date) )
select
a.account_name
,a.age
,a.date
,lead(a.date, 2 ,a.date) over (partition by a.account_name order by a.age desc) next_date
from mytable a
代码解析:根据account_name分区,按age从大到小排序,每次读取下两行的date字段数据,若无数据,则取当前行的默认值数据 。