Myślę, że możesz po prostu użyć min()
i max()
dla uproszczenia, aby uzyskać czasy dla par stawka/aplikacja. Reszta to tylko agregacja i więcej agregacji.
Opisane przez Ciebie przetwarzanie wygląda następująco:
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 sprawia, że założenia są zgodne z dostarczonymi danymi – stany nie mają duplikatów dla par stawka/aplikacja, a zatwierdzenie jest zawsze po sprawdzeniu.