Как посчитать Average Handle Time в SQL

Проверь себя · 1/3разбор после ответа
В выводе EXPLAIN вы видите оценку cost=0.00..431.00. Какой вывод аналитик может сделать безопасно?

Зачем AHT

Average Handle Time — это talk + hold + wrap-up. Операционная метрика. Низкий AHT = больше звонков на агента, но при слишком низком AHT страдает качество.

Формула

AHT = (Total Talk Time + Total Hold Time + Total Wrap-up Time) / Calls

Базовый расчёт

Данные: calls(call_id, agent_id, talk_seconds, hold_seconds, wrap_seconds, call_ended_at).

SELECT
    DATE_TRUNC('day', call_ended_at) AS day,
    COUNT(*) AS total_calls,
    AVG(talk_seconds + hold_seconds + wrap_seconds) AS aht_seconds,
    AVG(talk_seconds + hold_seconds + wrap_seconds) / 60.0 AS aht_minutes,
    AVG(talk_seconds) AS avg_talk,
    AVG(hold_seconds) AS avg_hold,
    AVG(wrap_seconds) AS avg_wrap
FROM calls
WHERE call_ended_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;

По агентам

SELECT
    agent_id,
    COUNT(*) AS calls,
    AVG(talk_seconds + hold_seconds + wrap_seconds) AS aht,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY talk_seconds + hold_seconds + wrap_seconds) AS median_aht
FROM calls
WHERE call_ended_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY agent_id
HAVING COUNT(*) >= 50
ORDER BY aht;

Лучшие агенты — короткий AHT при высоком CSAT. Выбросы: сам по себе высокий AHT может означать как слабого агента, так и просто сложные звонки.

Закрепи формулу avg handle time в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать avg handle time в Telegram

По типам

SELECT
    call_reason,
    COUNT(*) AS calls,
    AVG(talk_seconds + hold_seconds + wrap_seconds) AS aht,
    AVG(csat_score) AS avg_csat
FROM calls
WHERE call_ended_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY call_reason
ORDER BY calls DESC;

У разных типов звонков естественно разный AHT. Сравнивайте внутри одного типа.

Частые ошибки

Ошибка 1. Считать только talk time. Hold и wrap тоже важны. Реальная стоимость звонка включает все три составляющие.

Ошибка 2. Выбросы. Один звонок на 4 часа перекашивает среднее. Используйте медиану и p90.

Ошибка 3. Оптимизировать AHT в отрыве от остального. AHT снизился — но не упал ли заодно FCR? Тогда это плохой размен.

Ошибка 4. Wrap не логируется. Если агенты не фиксируют время на wrap-up, AHT занижается.

Ошибка 5. Путать с idle time. Простой между звонками (idle) — это не AHT, а отдельная метрика, утилизация.

Связанные темы

FAQ

Какой AHT считается нормальным?

Зависит от отрасли. В техподдержке норма — 8–12 минут, в банках — 5–7 минут, в e-commerce — 3–5 минут. Ориентируйтесь на бенчмарк своей ниши, а не на абсолютную цифру.

Снижение AHT — это хорошо?

Только если при этом не проседает качество — CSAT и FCR остаются на месте. Если агенты просто гонят звонки, клиент получает скомканный опыт, и это в итоге бьёт по продукту.

Что такое wrap-up time?

Это административная работа сразу после звонка: обновить тикет, отправить письмо-подтверждение. В норме wrap-up должен занимать не больше времени, чем сам разговор.

AHT по каналам?

В голосе AHT обычно 5–10 минут, в чате — 3–5 минут, потому что агент ведёт несколько диалогов параллельно. Почту считают отдельно — там метрика скорее время ответа, а не handle time.

Median vs Average?

У AHT длинный правый хвост, поэтому среднее легко перекашивают выбросы. Смотрите на медиану и p90 — они устойчивее и честнее описывают типичный звонок.