SQL交叉日期问题
表:promotion_info 记录了每个品牌每个优惠的活动时间,同一个品牌优惠活动可能会有交叉
字段:brand start_date end_date
需求:求每个品牌的优化总天数,同一个品牌多个优惠活动在同一天,则算一天
思路:
需要两个优化活动的开始结束时间区间做比较,
拿到前面最大的结束日期,
(以下是拿有效开始日期的方法)
如果这个最大的结束日期是第一行,就是null,那有效开始日期就是本身start_date
如果结束日期比最大的结束日期小,那就是无效的,过滤掉
如果开始日期大于最大的结束日期,那有效开始日期就是start_date,否则就是最大的结束日期+1天
1 select brand,sum(ct) promotion_day_count from ( 2 select brand,datediff(end_date,start_date) + 1 ct from ( 3 4 select 5 brand,end_date 6 ,if(max_end_date is null,start_date,if(end_date < max_end_date,'0',if(start_date > max_end_date,start_date,date_add(max_end_date,interval 1 day) ))) 7 start_date 8 9 from ( 10 select brand,start_date,end_date, 11 max(end_date) over(partition by brand order by start_date rows between unbounded preceding and 1 preceding) max_end_date from promotion_info 12 ) a 13 ) b where start_date != '0' 14 ) c group by brand
浙公网安备 33010602011771号