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

发布于:2024-03-21 ⋅ 阅读:(69) ⋅ 点赞:(0)

在这里插入图片描述

思路一:

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

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

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

​ 先通过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 最后如果是正数就留下,负数就说明是算过

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到