(HQL经典题目):求各个品牌最大连续优惠天数
用到的知识点
- 开窗函数
- case when then end语法
- 聚合函数 Max(),Sum()
- 日期函数 datediff
- 子查询
表数据
做题思路
这个题目的考察难点就在于存在重复的天数,也就是说5-9号优惠,7-10号也可以优惠,这么一算最大的优惠天数就是 (10-5 +1) 天,本题难点就在于我们怎么处理这个重复的天数
我是先用开窗函数,对开始日期进行升序排序,然后求出*从最开始的优惠日期到每个日期的上一次的优惠日期的最大的结束日期*, ( before_MaxEDT )这句话可能有点绕口,实在看不懂的话一会结合我的HQL语句进行理解
下一步就是分情况判断 当前结束日期以及开始日期和我们通过开窗函数求出的before_MaxEDT进行比较计算,分类讨论
- if( before_MaxEDT is null ) --> val = edt-sdt+1
- if( before_MaxEDT >= edt ) --> val = 0
- if( before_MaxEDT < edt and before_MaxEDT >= sdt) --> val=edt-before_MaxEDT
- if( before_MaxEDT < sdt ) --> val=edt-sdt+1
最后一步我们直接group by brand 在进行sum即可
完整HQL代码
/* table_name is tselectbrand,sum(t3.val)
from(select*,casewhen before_MaxEDT is null then datediff(edt,stt)+1when before_MaxEDT>=edt then 0when before_MaxEDT<edt and before_MaxEDT>=stt then datediff(edt,before_MaxEDT)when before_MaxEDT<stt then datediff(edt,stt)end valfrom(select*,max(edt) over(partition by brand order by stt asc rows between unbounded preceding and 1 preceding) before_MaxEDTfrom t)t2
)t3
group by brand