with t1 as (
select *
from (
select staff_id, weather_id,
sum(case when is_complaint=1 then 1 else 0 end)/count(1) as complaint_rate,
avg(delivery_time) as average_delivery_time
from delivery_records
group by staff_id, weather_id
) temp
where complaint_rate<0.5
), t2 as (
select staff_id
from delivery_staff
where average_speed>20
)
select weather_type,
round(avg(delivery_time), 2) as average_delivery_time,
count(1) as delivery_count
from delivery_records t3 join weather_conditions t4 on t3.weather_id=t4.weather_id
where staff_id in (
select t1.staff_id from t1 join t2 on t1.staff_id=t2.staff_id
)
group by weather_type
order by weather_type