- Сортировка набора данных по сервису, updated_at как c
- Создайте переменные, в которых вы сохраните предыдущую обработанную строку
Возможно, вам потребуется отслеживать: last_row_service_id last_row_status last_row_updated_date
Набор данных процесса
#pseudocode
@SET last_row_service_id := -1;
@SET last_row_status := -10; #set to -10 so that we wont have -1 or +1 value in first row
@SET last_row_updated_date :='2020-08-06 00:00:00';
select DATE(updated_date) as 'Date', serviceId as ServiceId,
SUM(IF(@last_row_service_id = serviceId AND @last_row_status - status = 1,
#check if youre still on the same service and if last_row_status is 1 and current row status is 0
TIME_TO_SEC(updated_date) - TIME_TO_SEC(@last_row_updated_date), 0)) as 'Available',
#Get elapsed time in seconds, else return 0 seconds
# Do the same to 'Not available'
SUM(IF(@last_row_service_id = serviceId AND @last_row_status - status = -1,
TIME_TO_SEC(updated_date) - TIME_TO_SEC(@last_row_updated_date), 0)) as 'Not available',
# change value of pointers
@last_row_service_id := serviceId,
@last_row_status := status,
@last_row_updated_date := updated_date
from TblStatus
#Add your date filter
group by DATE(updated_date),serviceId
Вам все еще нужно обрабатывать время безотказной работы службы, которое длится после 23: 59: 59
Что вы можете сделать, так это добавить START (статус 1) событие в каждом начале дня и событие STOP (статус 0) в каждый конец дня перед обработкой.