Мисля, че можете просто да използвате min()
и max()
за по-лесно получаване на времената за двойките оферта/приложение. Останалото е просто агрегиране и още агрегиране.
Обработката, която описвате, изглежда е:
select avg(avg_bid_diff)
from (select bid, avg(diff*1.0) as avg_bid_diff
from (select bid, appid,
datediff(second, min(starttime), max(statustime)) as diff
from t
where appstatus in ('In Review', 'Approved')
group by bid, appid
having count(*) = 2
) ba
group by bid
) b;
Това прави предположения, които са в съответствие с предоставените данни – че състоянията нямат дубликати за двойките оферта/приложение и че одобрението винаги е след преглед.