🌿挑战100天不停更,刷爆 hive sql🧲
详情请点击🔗我的专栏🖲,共同学习,一起进步~
文章目录
NUM: 第17天 -时间进行累计
时间的问题需要对时间函数掌握的很全面,并且对时间的获取和转换流程很清楚,才能游刃有余解决问题,可以根据总的需求一步步的向下推,不断的寻求每个时间的解法
🧨不废话,刷题~~🧨
🎈表结构
🎉建表
-- 时间序列,构造累计时间
--建表并插入数据
create table t17
(
date_id string
);
insert into t17 (date_id)
values ('2017-08-01'),
('2017-08-02'),
('2017-08-03');
👓求出每个日期的,从月初到当天
👙从月初到当天累计
– 求出每个日期的,从月初到当天
– 例如: 2017-08-01 是 2017-08-01 -> 2017-08-01 2号分为两行 1
– 2017-08-02 分两行 2017-08-01 -> 2017-08-02 2017-08-01 -> 2017-08-01
– 依次类推~~
✨先看执行结果
🎨思考
- 根据结果看来其实是讲一行转为多行的操作,估计是需要炸裂函数? 那选
posexplode()
还是explode()
呢?当然是posexplode()对于累计务必要取出索引值 - 下一步思考子查询,如何求得 当前的第一天??
date_add()
加天数,date_sub()
减天数 - sql
- 当前天 - 当前月的第一天
- 求相隔的天数,并炸裂出多行
- 根据
pos
索引值一次对当前第一天进行累加
🧨SQL
select date_id
, date_add(date_start_id, pos) as date_to_day
from (select date_id
, date_sub(date_id, dayofmonth(date_id) - 1) as date_start_id
from t17) t0 lateral view posexplode(
split(space(datediff(from_unixtime(unix_timestamp(date_id, 'yyyy-MM-dd')),
from_unixtime(unix_timestamp(date_start_id, 'yyyy-MM-dd')))
), '')) t1 as pos, val;