1. 题目要求
现有各品牌优惠周期表(promotion_info)如下,其记录了每个品牌的每个优惠活动的周期,其中同一品牌的不同优惠活动的周期可能会有交叉。
现要求统计每个品牌的优惠总天数,若某个品牌在同一天有多个优惠活动,则只按一天计算。期望结果如下:
2. 查询sql
-- 思路:可以补充当前表,给定一个字段,字段名称随意,使用空格填充,空格个数由当前品牌的打折起止时间和结束时间来定,在进行列转行,实现多行操作.
WITH t1 AS (
SELECT brand,
start_date,
end_date,
-- 1、给定一个字段:使用空格填充,空格个数是结束时间到起止时间的间隔天数.
space(datediff(end_date, start_date)) AS space_num
FROM promotion_info
),
t2 AS (
-- 2、将上面的t1表进行列转行操作,实现一列变多行(炸裂 + 侧写).
SELECT brand,
start_date,
end_date,
space_id
FROM t1 LATERAL VIEW explode(split(space_num, ' ')) space_rows AS space_id
),
t3 AS (
SELECT
brand,
-- 3、计算每个品牌的打折时间,打折时间=打折的起止时间+ 排名,这里的 - 1 操作是为了每个品牌的起止打折时间就是打折时间,后面依次 + 1
date_add(start_date, row_number () OVER (PARTITION BY brand, start_date) - 1) AS promotion_date
FROM t2
)
SELECT brand,
-- 4、最后按照品牌分组,打折时间去重进行打折天数的统计
count(DISTINCT promotion_date) AS promotion_day_count
FROM t3
GROUP BY brand;