with t as (
select order_id,
d.rider_id,
TIMESTAMPDIFF(SECOND, pickup_time, deliver_time) / 60.0 duration,
case when hour(pickup_time) between 6 and 10 then 'morning'
when hour(pickup_time) between 11 and 13 then 'noon'
when hour(pickup_time) between 17 and 20 then 'evening'
else 'night'
end time_slot,
case when date(pickup_time) between date_add(reg_date,interval 7 day) and date_add(reg_date,interval 13 day) then 'W1'
when date(pickup_time) between date_add(reg_date,interval 14 day) and date_add(reg_date,interval 20 day) then 'W2'
when date(pickup_time) between date_add(reg_date,interval 28 day) and date_add(reg_date,interval 34 day) then 'W4'
else null
end retention_week
from t_delivery d
left join t_rider r on d.rider_id = r.rider_id
where status='FINISHED' and date(pickup_time) >= date_add(reg_date,interval 7 day)
)
,t1 as(
select d.rider_id,
case when count(distinct order_id)>=30 then 'T1'
when count(distinct order_id)>=15 and count(distinct order_id)<= 29 then 'T2'
when count(distinct order_id)>=1 and count(distinct order_id)<= 14 then 'T3'
else null
end tier
from t_delivery d
left join t_rider r on d.rider_id = r.rider_id
where status='FINISHED' and date(pickup_time) <= date_add(reg_date,interval 6 day)
group by rider_id
)
,t2 as (
select tier,
count(distinct rider_id) total
from t1
where tier is not null
group by tier
)
,full as (
select *
from (select 'T1' as tier union all select 'T2' union all select 'T3') a
cross join (select 'W1' as retention_week union all select 'W2' union all select 'W4') b
cross join (select 'morning' as time_slot union all select 'noon' union all select 'evening' union all select 'night') c
)
select f.tier,
f.retention_week,
f.time_slot,
coalesce(count(distinct t.rider_id),0) active_rider_cnt,
round(coalesce(count(distinct t.rider_id)/max(total),0),2) retention_rate,
round(coalesce(avg(duration),0),2) avg_duration_min
from full f
left join t1 on t1.tier = f.tier
left join t on f.retention_week = t.retention_week
and f.time_slot = t.time_slot
and t.rider_id = t1.rider_id
left join t2 on t2.tier = f.tier
group by f.tier,
f.retention_week,
f.time_slot
order by f.tier,f.retention_week,field(f.time_slot,'morning','noon','evening','night'),active_rider_cnt desc