Обращаясь к своему индексу, убедитесь, что вы указали в поле рекламодателя время вверху слева
и может быть полезным, добавьте также врага time_at_location, чтобы избежать доступа к таблице данных и использовать данные из индекса
индекс для таблицы train_announcements
столбцы (advertised_time, location_signature, activity_type, time_at_location)
SELECT location_signature
, activity_type
, SUM(CASE WHEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location) > 0
THEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location)
ELSE 0 END) as delay_time
, count(id) as total_train_count
, SUM(CASE WHEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location) > 0
THEN 1
ELSE 0 END) as delayed_train_count
from `train_announcements`
where `advertised_time` BETWEEN '2019-04-01 10:00:00' and '2019-04-30 10:00:00'
group by `location_signature`, `activity_type`
order by `delay_time` desc
limit 10 offset 0;
и если у вас нет id с нулевым значением, попробуйте использовать count (*) вместо count (id)
SELECT location_signature
, activity_type
, SUM(CASE WHEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location) > 0
THEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location)
ELSE 0 END) as delay_time
, count(*) as total_train_count
, SUM(CASE WHEN TIMESTAMPDIFF(MINUTE,advertised_time, time_at_location) > 0
THEN 1
ELSE 0 END) as delayed_train_count
from `train_announcements`
where `advertised_time` BETWEEN '2019-04-01 10:00:00' and '2019-04-30 10:00:00'
group by `location_signature`, `activity_type`
order by `delay_time` desc
limit 10 offset 0;
или если вам действительно нужен идентификатор, попробуйте добавить этот столбец в составной индекс
(advertised_time, location_signature, activity_type, time_at_location, id )