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

 

posted on 2025-06-23 12:14  北京的小乔  阅读(18)  评论(0)    收藏  举报