Hive SQL必刷练习题:日期交叉问题(两种思路)

在这里插入图片描述

思路一:

首先想到的是借助炸裂函数,一行变成多行,就可以进行去重操作,然后再统计日期。

用到炸裂函数,就首先需要可以拿到起始和终止日期差大小的数组,然后再炸裂

那这个指定长度数组怎么获取呢?

​ 先通过datediff + 1,就可以知道我们需要的数组是多大的

​ 通过spilt( repeat(“,” , 4) ,’ , ') 这样就创建了一个有5个空字符串的数组,数组长度是5

​ 所以就是spilt( repeat(“,” , diff) , ’,’ ) 【注意这个diff是不需要加1的,因为创建长度是五的数组,这个diff只要是4就够了】

​ 炸完之后是下面这样,然后再进行一次row_number,进行排序,最后把排序的序号给start_date加上就行

在这里插入图片描述

​ 或者直接不用explode(arr),直接用posexplode(arr) tmp as pos,item

​ 这就不用row_number,可以直接加上这个pos了

思路二:

(1, ‘oppo’, ‘2021-06-05’, ‘2021-06-09’),
(2, ‘oppo’, ‘2021-06-11’, ‘2021-06-21’),
(3, ‘vivo’, ‘2021-06-05’, ‘2021-06-15’),
(4, ‘vivo’, ‘2021-06-09’, ‘2021-06-21’),
(5, ‘redmi’, ‘2021-06-05’, ‘2021-06-21’), 1974-01-01
(6, ‘redmi’, ‘2021-06-09’, ‘2021-06-15’), 2021-06-21
(7, ‘redmi’, ‘2021-06-17’, ‘2021-06-26’), 2021-06-26
(8, ‘huawei’, ‘2021-06-05’, ‘2021-06-26’),
(9, ‘huawei’, ‘2021-06-09’, ‘2021-06-15’),
(10, ‘huawei’, ‘2021-06-17’, ‘2021-06-21’);

但是也可以用一个别的思路:相当于就是通过更新start_date,来解决可能的时间交叉或者包含关系

同一个品牌,到当前行为止,去用到当前行之前的最大end_date日期,去比对当前的start_date如果大于最大end_date,那就说明没有交集,这一行的start_date就是原本的这个。否则start_date就是****date_add(max_end_date,1)

最后end - start 最后如果是正数就留下,负数就说明是算过

在这里插入图片描述

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值