字节大数据开发一面SQL题【2023/03/22】
问题描述:
- 有一张tmp表,字段分别是 开始时间start_date,结束时间end_date,欠费金额amount
2015-03-02 2015-03-05 10 2015-03-04 2015-03-06 20
输出描述:用户每天需要还的金额
2015-03-02 10 2015-03-03 10 2015-03-04 30 2015-03-05 30 2015-03-06 20
分析:根据题目描述的输入输出,很容易知道思路哈,就是想要把从开始时间到结束时间的每一条数据都拆开存储,然后根据日期去聚合就可以得到每天的欠费金额了,所以难点就在于如何根据一个起始时间来进行拆分呢?
- 一行转多行,让我们可以想到的就是使用炸裂函数explode/posexplode,显然我们想要的是 生成开始时间到结束时间的长度,然后遍历这个长度,在开始时间上进行累加就可以得到所有日期了,因此使用posexplode才可以完成这个目标。
- 总结:posexplode可以用于生成动态日期序列
代码:
select date, sum(amount) as total_amount from ( select date_add(start_date,id) as date, amount from tmp lateral view posexplode(split(space(datediff(end_date,start_date)),' ')) t as id,t_date ) t group by date ;
~~ps:这是昨天字节一面的一个同学分享给我的一个SQL面试题目,希望大家多总结自己不会的题目!!!有面试中遇到的问题都可以记录下来分享给我,我会就一些比较经典的问题来进行解答然后分享出来~~
#你觉得今年春招回暖了吗##大数据开发面经##HQL##字节#