Нужно объединить интервалы недоступности всех хостов и измерить их пересечение с каждым днём. Складывать время каждого хоста нельзя: одновременные отказы посчитаются несколько раз.
Решите домашнюю задачу: дан лог результатов проверки доступности хостов кластерной СУБД (ts, host, status = UP/DOWN). Для каждого дня посчитать время, в течение которого хотя бы один хост был недоступен; проверки происходят раз в 30 секунд.
Нужно объединить интервалы недоступности всех хостов и измерить их пересечение с каждым днём. Складывать время каждого хоста нельзя: одновременные отказы посчитаются несколько раз.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Нужно объединить интервалы недоступности всех хостов и измерить их пересечение с каждым днём. Складывать время каждого хоста нельзя: одновременные отказы посчитаются несколько раз.
Примите явную модель: статус действует от проверки до следующей проверки этого хоста. По каждому host отсортируйте ts и через LEAD получите интервалы [ts, next_ts); оставьте DOWN. Последний интервал ограничьте концом наблюдения по согласованному правилу.
сортировать DOWN-интервалы по началу
для каждого [start, end):
если start <= конец последнего объединённого:
продлить его конец до max(конец, end)
иначе добавить новый интервал
разрезать объединённые интервалы по границам дней
сложить длительности фрагментов для каждого дня
Добавьте календарь, чтобы показать дни с нулём. Пропуски проверок требуют отдельного состояния «нет данных». Точный момент сбоя между проверками неизвестен: результат является оценкой по выбранной модели, а не измерением с секундной точностью.