HIVE 分析函数lead(),lag()等在数值计算时可能产生的问题
Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
在使用过程中,常常用来计算数据与邻近数据的差值。虽然操作可以用自连接实现,但是LAG和LEAD与left join、rightjoin等自连接相比,效率更高,SQL更简洁。
函数语法如下:
lag(exp_str,offset,defval) over(partion by …order by …)
lead(exp_str,offset,defval) over(partion by …order by …)
该函数必须与窗口函数同时使用,单独使用会报错:
Missing over clause for function : lead
记住这个结论
于是在求差值时可能会遇到一个隐秘的问题:看下面的SQL:
1.select id,time,(price-lead(price,1,0) over(partition by id order by replace(time,":","") )) bf from t2,
2.select id,time,(lead(price,1,0)-price over(partition by id order by replace(time,":","") )) af from t2;
第一条SQL使用lead 计算了当前price与后一条price的差值,没有问题
但是第二条计算后一条与当前price差值时报了无法识别的错误: