Если вас беспокоит производительность, вы можете назначить значение для каждой строки, которое представляет собой совокупное число «допустимых». Затем используйте это для агрегации:
select max(case when typeid = 'approved' then date end) as approved_date,
max(case when typeid = 'admitted' then date end) as admitted_date,
datediff(max(case when typeid = 'admitted' then date end),
max(case when typeid = 'approved' then date end)
) as diff
from (select t.*,
(@cnt := @cnt + (typeid = 'approved')) as grp
from (select t.* from t order by date) t cross join
(select @cnt := 0) params
) t
group by grp;
Это может использовать индекс на (date)
для назначения grp
. Тогда просто нужно сделать group by
.
. Использование коррелированного подзапроса может стать довольно дорогим с ростом размера данных. Так что для больших данных это должно быть намного эффективнее.
В любом случае использование оконных функций (доступно в MySQL 8+) является гораздо более предпочтительным решением.