(HQL经典题目):求各个品牌最大连续优惠天数

该文章详细解析了一个HQL经典问题,即如何计算每个品牌最大的连续优惠天数。文中提到的难点在于处理日期间的重叠部分,并使用了开窗函数进行排序和获取每个日期的上一次优惠日期的最大结束日期。通过CASEWHENTHENEND语句进行不同情况的判断,计算优惠天数,最后通过GROUPBY进行品牌分组并求和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(HQL经典题目):求各个品牌最大连续优惠天数

用到的知识点

  1. 开窗函数
  2. case when then end语法
  3. 聚合函数 Max(),Sum()
  4. 日期函数 datediff
  5. 子查询

表数据

数据展示

做题思路

这个题目的考察难点就在于存在重复的天数,也就是说5-9号优惠,7-10号也可以优惠,这么一算最大的优惠天数就是 (10-5 +1) 天,本题难点就在于我们怎么处理这个重复的天数

我是先用开窗函数,对开始日期进行升序排序,然后求出*从最开始的优惠日期到每个日期的上一次的优惠日期的最大的结束日期*, ( before_MaxEDT )这句话可能有点绕口,实在看不懂的话一会结合我的HQL语句进行理解

下一步就是分情况判断 当前结束日期以及开始日期和我们通过开窗函数求出的before_MaxEDT进行比较计算,分类讨论

  1. if( before_MaxEDT is null ) --> val = edt-sdt+1
  2. if( before_MaxEDT >= edt ) --> val = 0
  3. if( before_MaxEDT < edt and before_MaxEDT >= sdt) --> val=edt-before_MaxEDT
  4. if( before_MaxEDT < sdt ) --> val=edt-sdt+1

最后一步我们直接group by brand 在进行sum即可

完整HQL代码

/* table_name is t

select
	brand,
	sum(t3.val)
from(
    select
        *,
        case
        when before_MaxEDT is null then datediff(edt,stt)+1
        when before_MaxEDT>=edt then 0
        when before_MaxEDT<edt and before_MaxEDT>=stt then datediff(edt,before_MaxEDT)
        when before_MaxEDT<stt then datediff(edt,stt)
        end val
    from(
        select
            *,
            max(edt) over(partition by brand order by stt asc rows between unbounded preceding and 1 preceding) before_MaxEDT
        from t
    )t2
)t3
group by brand
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C_x_330

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

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

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

打赏作者

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

抵扣说明:

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

余额充值