今天,遇到了一个有趣的需求,如果一个日期对应的value没有值,则向前取最近日期的value。
可能说的不太清楚,拿一段数据举例,例如,当B为20191207、20191208、20191209时,C为null,C要取20191206的值:
尝试了好久,掉了好几根头发,终于总结出一个方法ヽ( ̄▽ ̄)ノ
思路:
1、对表进行筛选,去掉null值,并RowNumber,结果如下
2、将表自关联,利用rn,将日期错开,得到取C值的区间(区间内值取E)
3、这样,再和原表关联,限定时间的范围,在case when 一下,就能得到该日期的C值。
本人使用Impala查询,部分函数与Oracle有些许差异。其实大部分就是格式转化,我也不想来回转化类型,谁让位卑言轻呢 ╮(╯^╰)╭ ,SQL如下:
注:由于公司数据需要保密,表名以及字段已进行了转化
select q1.b,q1.c,q2.*
from table q1,
(
select p1.a,
p2.b start_dt,
p1.b end_dt,
--p1.rn,p2.rn,
p1.c d,p2.c s
from (
select a,b,c,
row_number() over(partition by a order by b desc) rn
from (select a,b,c
from table
where c is not null
and a='000904'
union all
select '900804' a,
cast(from_unixtime(unix_timestamp(to_timestamp(cast(now() as string),'yyyy-MM-dd')),'yyyyMMdd') as int) b ,
null c
) s
) p1
left join (
select a,b,c,
row_number() over(partition by a order by b desc) rn
from table
where a='000904'
and c is not null
order by b desc
) p2
on p1.a=p1.a
and p1.rn=p2.rn
order by p1.b desc
) q2
where q1.a=q2.a
and q1.b>=q2.start_dt
and q1.b<=q2.end_dt
order by q1.b desc
简单小记,随缘更新,欢迎评论交流~