SQL案例(一)

今天,遇到了一个有趣的需求,如果一个日期对应的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

简单小记,随缘更新,欢迎评论交流~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值