Myslím, že stačí použít min()
a max()
pro zjednodušení získat časy pro páry nabídka/aplikace. Zbytek je jen agregace a další agregace.
Zdá se, že zpracování, které popisujete, je:
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;
To vytváří předpoklady, které jsou v souladu s poskytnutými údaji – že stavy nemají duplikáty pro páry nabídka/aplikace a že schválení je vždy po kontrole.