44. 日期交叉问题

题目需求

现有各品牌优惠周期表(promotion_info)如下,其记录了每个品牌的每个优惠活动的周期,其中同一品牌的不同优惠活动的周期可能会有交叉。

现要求统计每个品牌的优惠总天数,若某个品牌在同一天有多个优惠活动,则只按一天计算。

期望结果如下(截取部分):

brand (品牌)promotion_day_count (优惠天数)
vivo17
oppo16
redmi22
huawei22

需要用到的表:

各品牌优惠周期表:promotion_info

promotion_idbrandstart_dateend_date
1oppo2021-06-052021-06-09
2oppo2021-06-112021-06-21
3vivo2021-06-052021-06-15
思路一

在这里插入图片描述

实现一
-- 实现一: from 网友
-- 思路: ( 最大活动结束时间 - 最小活动开始时间 + 1 ) 求出总长,然后减去中间没有活动的时间

SELECT brand,
       datediff(max(end_date), min(start_date)) + 1 -
       sum(if(blank_brand_date > 0, blank_brand_date, 0)) promotion_day_count
from (
         SELECT brand,
                start_date,
                end_date,
                datediff(
                        start_date,
                        -- 本次活动开始之前该品牌所有活动中最大的活动结束日期
                        max(end_date)
                            over (partition by brand order by start_date rows BETWEEN UNBOUNDED PRECEDING and 1 PRECEDING)
                    ) - 1 blank_brand_date -- 没有活动的天数
         from promotion_info
     ) t
group by brand;
原理二

在这里插入图片描述

实现二
-- 思路: 已知开始日期和结束日期,动态生成此范围内的日期序列。

-- 2) 按照 brand 分组, 统计每个品牌的优惠总天数
select brand,
       size(collect_set(`current_date`)) as promotion_day_count
from (
         -- 1) 已知开始日期和结束日期,动态生成此范围内的日期序列
         select brand,
                date_add(start_date, pos) as `current_date`
         from promotion_info
                  lateral view posexplode(split(space(datediff(end_date, start_date)), ' ')) tmpTable as pos, val
     ) t1
group by brand;
学习链接

【Hive】生成动态日期序列

题目来源

http://practice.atguigu.cn/#/question/44/desc?qType=SQL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloooi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值