一、需求
品牌打折数据:
tm_id start_time end_time
1001 2021-12-05 2021-12-09
1001 2021-12-12 2021-12-15
1002 2021-12-05 2021-12-09
1002 2021-12-07 2021-12-15
1003 2021-12-05 2021-12-23
1003 2021-12-09 2021-12-17
1003 2021-12-11 2021-12-25
1004 2021-12-05 2021-12-23
1004 2021-12-09 2021-12-12
1004 2021-12-15 2021-12-25
每个品牌可能有多个打折活动,而打折活动的时间段可能会有重叠,统计每个品牌实际参与打折的天数。
注意日期有交叉,交叉日期只计算一次。
例如:
1002第一次活动是 2021-12-05 到 2021-12-09
1002第二次活动是 2021-12-07 到 2021-12-15
其中 7、8、9 三天为两个活动同时进行的时间,只计算一次,即1002活动总天数为 2021-12-05 到 2021-12-15为期11天。
准备数据:
//创建表activity_tm
create table if not exists activity_tm(
tm_id int,
start_time string,
end_time string)
row format delimited fields terminated by '\t';
//装载数据
load data local inpath '/opt/module/data/activity1.txt' into table activity_tm;
最终预计统计结果:
tm_id days
1001 9
1002 11
1003 21
1004 21
二、思路一代码及测试(X)
当不考虑存在交叉日期时,求解方法为按品牌分组,对各个打折时间段分别结束日期减去开始日期的差值+1,然后求和。
sele