说明:Lag和Lead分析函数可以在同一次查询中取出同 一字段的前N行的数据(Lag)和后N行的数据(Lead)作为 独立的列。 在实际应用当中,若要用到取今天和昨天的某字段差值 时,Lag和Lead函数的应用就显得尤为重要。当然,这 种操作可以用表的自连接实现,但是LAG和LEAD与left join、right join等自连接相比,效率更高,SQL语句更 简洁。
lag(exp_str,offset,defval) over(partion by ……
order by ……)
lead(exp_str,offset,defval) over(partion by ……
order by ……)
exp_str是字段名称。 offset表示偏移量,即是上1个或上N个的值,假设当 前行在表中排在第5行,则offset 为3,则表示我们所 要找的数据行就是表中的第2行(即5-3=2)。offset 默认值为1。 defval默认值,当这两个函数取上N/下N个值时,在 表中从当前行位置向前数N行已经超出了表的范围 时,lag()函数将defval这个参数值作为函数的返回 值,若没有指定默认值,则返回NULL。lead()函数也 是一样的道理。那么在数学运算中,总要给一个默认 值才不会出错。
lag例子
SELECT user_name,
dt,
lag(dt,1,dt) over(partition by user_name order by dt),
lag(dt) over(partition by user_name order by dt),
lag(dt,2,dt) over(partition by user_name order by dt),
lag(dt,2) over(partition by user_name order by dt)
FROM user_trade
WHERE dt>'0' and user_name='Alice';
– 需求8:支付时间间隔超过100天的用户数
select count(distinct a.user_name)
from
(select user_name,dt,
lead(dt,1,dt) over(partition by user_name order by dt)as lead_dt
from user_trade
where year(dt)>'0')a
where datediff(a.lead_dt,a.dt)>100;
注意:lead是将往后推 将当前的dt往后推一个进行做差,datediff是将两个时间做差求出天数来
– 需求9:每个城市,不同性别,2018年支付金额最高的TOP3用户 /* 1.2018年用户支付总金额求出来 2.获取所需的用户信息及排序序号 3.筛选最终数据 */
select *
from
(select a.user_name,b.city,b.sex,a.total_amount,
row_number()over(partition by b.city,b.sex order by a.total_amount desc)as num_rank
from
(select user_name,sum(pay_amount)as total_amount
from user_trade
where year(dt)=2018
group by user_name)a
left join user_info b
on a.user_name=b.user_name)c
where c.num_rank<=3;
– 需求10:每个手机品牌退款金额前25%的用户 /* 1.每个用户的退款总金额 2.获取用户手机品牌进关联,然后将手机品牌进行分组,按退款金额进行排序 3.切片,取出前25%的用户 */
select *
from
(select a.user_name,b.extra2['phonebrand'],a.total_refund,
ntile(4)over(partition by b.extra2['phonebrand'] order by a.total_refund desc)rank_lv
from
(select user_name,sum(refund_amount) as total_refund
from user_refund
where year(dt)>'0'
group by user_name)a
left join user_info b
on a.user_name=b.user_name)c
where c.rank_lv=1;
– json字符串
get_json_object(extra1, '$.phonebrand')
– map类型写法
extra2['phonebrand']
|