我是靠谱客的博主 无私钻石,最近开发中收集的这篇文章主要介绍(HQL经典题目):求各个品牌最大连续优惠天数(HQL经典题目):求各个品牌最大连续优惠天数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(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

最后

以上就是无私钻石为你收集整理的(HQL经典题目):求各个品牌最大连续优惠天数(HQL经典题目):求各个品牌最大连续优惠天数的全部内容,希望文章能够帮你解决(HQL经典题目):求各个品牌最大连续优惠天数(HQL经典题目):求各个品牌最大连续优惠天数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部