Как посчитать Average Handle Time в SQL
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 может означать как слабого агента, так и просто сложные звонки.
По типам
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, а отдельная метрика, утилизация.
Связанные темы
- Incident response на собесе SA
- Как посчитать first time fix rate в SQL
- Как посчитать CSAT в SQL
- Как посчитать NPS в SQL
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 — они устойчивее и честнее описывают типичный звонок.