某大佬的思想,实在是太经典了,我们一起来膜拜!!!
如下为平台商品促销数据:字段为品牌,打折开始日期,打折结束日期
brand stt edt
oppo 2021-06-05 2021-06-09
oppo 2021-06-11 2021-06-21
vivo 2021-06-05 2021-06-15
vivo 2021-06-09 2021-06-21
redmi 2021-06-05 2021-06-21
redmi 2021-06-09 2021-06-15
redmi 2021-06-17 2021-06-26
huawei 2021-06-05 2021-06-26
huawei 2021-06-09 2021-06-15
huawei 2021-06-17 2021-06-21
计算每个品牌总的打折销售天数,注意其中的交叉日期,比如vivo品牌,第一次活动时间为2021-06-05到2021-06-15,第二次活动时间为2021-06-09到2021-06-21其中9号到15号为重复天数,只统计一次,即vivo总打折天数为2021-06-05到2021-06-21共计17天。
首先让我们来认识几个函数
LanguageManual UDF - Apache Hive - Apache Software Foundation
posexplode (array) 给数组中的内容给一个 标号
space( ) 给空串 长度
select
id,
stt,
edt,
date_add(stt, pos-1),
t.pos
from(
select id,stt,edt from brand
) tmp lateral view posexplode(
split(space(datediff(edt, stt)+1), '')
) t as pos, val
where t.pos <> 0
把时间拆 每个做活动的商品拆成 具体的某天!
下面是最后的代码 ,对每个商品做活动的时间进行去重就得到了结果!!
最后代码
select
id,
count(distinct date_add(stt, pos-1)) as day_count
from(
select id,stt,edt from brand
) tmp lateral view posexplode(
split(space(datediff(edt, stt)+1), '')
) t as pos, val
where t.pos <> 0
group by id