View a markdown version of this page

Consultas de referencia para el lago de datos de Connect Customer - Amazon Connect Customer

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Consultas de referencia para el lago de datos de Connect Customer

En este tema se proporcionan consultas SQL de Athena (motor Trino v3) para calcular las métricas comunes de Connect Customer a partir de tablas de lagos de datos. Todas las consultas utilizan identificadores entre comillas dobles y asumen un nombre de base de datos. connect_datalake Ajuste el nombre de la base de datos para que coincida con la configuración de su catálogo de Glue.

Sustitúyalo <YOUR_INSTANCE_ID> en cada consulta por su ID de instancia de cliente de Connect.

Métricas de contactos y colas

Tasa de abandonos

Definición: Porcentaje de contactos desconectados por el cliente mientras estaban en cola. Se excluyen las devoluciones de llamadas.

Tabla fuente: contact_statistic_record

SELECT "queue_id", CAST(SUM("is_abandoned") AS DOUBLE) / NULLIF(SUM("is_queued"), 0) * 100.0 AS "abandonment_rate_pct" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id" ORDER BY "abandonment_rate_pct" DESC;

Contactos abandonados

Definición: número de contactos desconectados por el cliente mientras esperaban en la cola.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM("is_abandoned") AS "contacts_abandoned" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Contactos abandonados en X segundos

Definición: número de contactos abandonados a los X segundos de haber sido puestos en cola.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM( CASE WHEN "is_abandoned" = 1 AND "queue_time_ms" <= 30000 THEN 1 ELSE 0 END ) AS "contacts_abandoned_in_30s" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Tiempo medio de abandono de cola

Definición: tiempo promedio de espera de los contactos en la cola antes de abandonarse.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", AVG("abandon_time_ms") / 1000.0 AS "avg_queue_abandon_time_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "is_abandoned" = 1 AND "abandon_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Tiempo medio de respuesta de cola

Definición: tiempo promedio de espera de los contactos en la cola antes de ser respondidos por un agente.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", AVG("queue_answer_time_ms") / 1000.0 AS "avg_queue_answer_time_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "is_handled" = 1 AND "queue_answer_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Nivel de servicio

Definición: Recuento y porcentaje de contactos respondidos en X segundos.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM(CASE WHEN "is_handled" = 1 AND "queue_answer_time_ms" <= 20000 THEN 1 ELSE 0 END) AS "contacts_answered_in_20s", SUM("is_queued") AS "contacts_queued", CAST(SUM(CASE WHEN "is_handled" = 1 AND "queue_answer_time_ms" <= 20000 THEN 1 ELSE 0 END) AS DOUBLE) / NULLIF(SUM("is_queued"), 0) * 100.0 AS "service_level_20s_pct" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Contactos en cola

Definición: número de contactos colocados en una cola.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM("is_queued") AS "contacts_queued" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Contactos administrados

Definición: número de contactos conectados a un agente.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM("is_handled") AS "contacts_handled" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Contactos transferidos aceptados

Definición: contactos transferidos a una cola.

Tabla de origen: contact_statistic_record

SELECT "queue_id", SUM("is_transferred_in") AS "contacts_transferred_in" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Contactos transferidos fuera

Definición: contactos transferidos fuera de una cola.

Tabla de fuentes: contact_statistic_record

SELECT "queue_id", SUM("is_transferred_out") AS "contacts_transferred_out", SUM("is_transferred_out_internal") AS "transferred_out_internal", SUM("is_transferred_out_external") AS "transferred_out_external" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Tiempo máximo en cola

Definición: el tiempo más largo que un contacto ha pasado esperando en la cola.

Tabla de fuentes: contact_record

SELECT "queue_id", MAX("queue_duration_ms") / 1000.0 AS "max_queued_time_sec" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "queue_duration_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Duración promedio de contacto

Definición: Tiempo promedio desde el inicio del contacto hasta la desconexión.

Tabla de fuentes: contact_record

SELECT "queue_id", AVG( date_diff('millisecond', "initiation_timestamp", "disconnect_timestamp") ) / 1000.0 AS "avg_contact_duration_sec" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "initiation_timestamp" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Métricas de rendimiento del agente

Tiempo promedio de gestión

Definición: tiempo promedio desde la conexión del contacto hasta la finalización del ACW.

Tabla de fuentes: contact_statistic_record

SELECT "agent_id", AVG("handle_time_ms") / 1000.0 AS "avg_handle_time_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "is_handled" = 1 AND "handle_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "agent_id";

Tiempo de trabajo después de contacto

Definición: tiempo total que los agentes pasaron en el estado de ACW.

Tabla fuente: contact_statistic_record

SELECT "agent_id", SUM("after_contact_work_time_ms") / 1000.0 AS "total_acw_time_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "after_contact_work_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "agent_id";

Tiempo de cliente en espera

Definición: tiempo total que los clientes permanecieron en espera después de conectarse al agente.

Tabla de fuentes: contact_statistic_record

SELECT "agent_id", SUM("customer_hold_time_ms") / 1000.0 AS "total_hold_time_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "customer_hold_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "agent_id";

Tiempo de inactividad del agente

Definición: tiempo que el agente pasó en estado disponible sin gestionar los contactos.

Tabla fuente: agent_statistic_record

SELECT "user_id" AS "agent_id", SUM("agent_idle_time") / 1000.0 AS "total_idle_time_sec" FROM "connect_datalake"."agent_statistic_record" WHERE "published_date" >= TIMESTAMP '2026-06-09 00:00:00' AND "published_date" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "user_id";

Ocupación

Definición: Porcentaje de tiempo que los agentes estuvieron activos en los lentes de contacto en comparación con los disponibles más activos.

Tabla fuente: agent_statistic_record

SELECT "user_id" AS "agent_id", CAST(SUM("agent_on_contact_time") AS DOUBLE) / NULLIF(SUM("agent_on_contact_time") + SUM("agent_idle_time"), 0) * 100.0 AS "occupancy_pct" FROM "connect_datalake"."agent_statistic_record" WHERE "published_date" >= TIMESTAMP '2026-06-09 00:00:00' AND "published_date" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "user_id";

Sin respuesta del agente

Definición: número de contactos enviados al agente pero no respondidos.

Tabla de origen: agent_queue_statistic_record

SELECT "user_id" AS "agent_id", "queue_id", SUM("agent_non_response") AS "agent_non_response_count" FROM "connect_datalake"."agent_queue_statistic_record" WHERE "published_date" >= TIMESTAMP '2026-06-09 00:00:00' AND "published_date" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "user_id", "queue_id";

Porcentaje de respuestas del agente

Definición: Porcentaje de contactos enrutados respondidos por el agente.

Tabla de fuentes: agent_queue_statistic_record

SELECT "user_id" AS "agent_id", CAST(SUM("contacts_handled") AS DOUBLE) / NULLIF(SUM("contacts_offered"), 0) * 100.0 AS "agent_answer_rate_pct" FROM "connect_datalake"."agent_queue_statistic_record" WHERE "published_date" >= TIMESTAMP '2026-06-09 00:00:00' AND "published_date" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "user_id";

Tiempo online

Definición: Tiempo total durante el cual el agente CCP estuvo configurado en un estado distinto al de Desconectado.

Tabla de origen: agent_statistic_record

SELECT "user_id" AS "agent_id", SUM("online_time") / 1000.0 AS "total_online_time_sec" FROM "connect_datalake"."agent_statistic_record" WHERE "published_date" >= TIMESTAMP '2026-06-09 00:00:00' AND "published_date" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "user_id";

Métricas de chat

Tiempo medio de primera respuesta del agente

Definición: Tiempo promedio que tarda el agente en enviar el primer mensaje después de obtener un contacto de chat.

Tabla de fuentes: contact_record

SELECT "queue_id", AVG("chat_contact_metrics_agent_first_response_time_ms") / 1000.0 AS "avg_agent_first_response_sec" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'CHAT' AND "chat_contact_metrics_agent_first_response_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Tiempo promedio de respuesta del agente

Definición: Tiempo promedio que los agentes tardan en responder a los mensajes de los clientes.

Tabla fuente: contact_record

SELECT "queue_id", CAST(SUM("chat_agent_metrics_total_response_time_ms") AS DOUBLE) / NULLIF(SUM("chat_agent_metrics_num_responses"), 0) / 1000.0 AS "avg_agent_response_time_sec" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'CHAT' AND "chat_agent_metrics_total_response_time_ms" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Promedio total de mensajes

Definición: promedio total de mensajes por contacto de chat.

Tabla de fuentes: contact_record

SELECT "queue_id", AVG(CAST("chat_contact_metrics_total_messages" AS DOUBLE)) AS "avg_total_messages" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'CHAT' AND "chat_contact_metrics_total_messages" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Conversaciones abandonadas

Definición: Contactos en los que un agente o un cliente abandonaron el chat.

Tabla de fuentes: contact_record

SELECT "queue_id", COUNT(*) AS "conversations_abandoned" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'CHAT' AND ("chat_agent_metrics_conversation_abandon" = true OR "chat_customer_metrics_conversation_abandon" = true) AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id";

Métricas de análisis de la conversación

Tiempo promedio de conversación

Definición: tiempo medio combinado de conversación entre el agente y el cliente por contacto de voz.

Tabla de fuentes: contact_lens_conversational_analytics

SELECT AVG("talk_time_total_ms") / 1000.0 AS "avg_talk_time_sec" FROM "connect_datalake"."contact_lens_conversational_analytics" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'VOICE' AND "instance_id" = '<YOUR_INSTANCE_ID>';

Tiempo promedio sin conversación

Definición: tiempo promedio de espera más silencio por contacto de voz.

Tabla de fuentes: contact_lens_conversational_analytics

SELECT AVG("non_talk_time_total_ms") / 1000.0 AS "avg_non_talk_time_sec" FROM "connect_datalake"."contact_lens_conversational_analytics" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'VOICE' AND "instance_id" = '<YOUR_INSTANCE_ID>';

Puntuaciones de opinión

Definición: puntuaciones generales de opinión del agente y el cliente.

Tabla fuente: contact_lens_conversational_analytics

SELECT AVG("sentiment_overall_score_agent") AS "avg_agent_sentiment", AVG("sentiment_overall_score_customer") AS "avg_customer_sentiment", AVG("sentiment_end_score_agent") AS "avg_agent_end_sentiment", AVG("sentiment_end_score_customer") AS "avg_customer_end_sentiment" FROM "connect_datalake"."contact_lens_conversational_analytics" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>';

Promedio de interrupciones del agente

Definición: recuento promedio de interrupciones de agentes por contacto.

Tabla de fuentes: contact_lens_conversational_analytics

SELECT AVG(CAST("interruptions_agent_count" AS DOUBLE)) AS "avg_agent_interruptions" FROM "connect_datalake"."contact_lens_conversational_analytics" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "channel" = 'VOICE' AND "instance_id" = '<YOUR_INSTANCE_ID>';

Métricas de agentes de IA

Tasa de éxito de invocación de agentes de IA

Definición: Tasa de invocaciones exitosas de agentes de IA.

Tabla de origen: ai_agent

SELECT "ai_agent_name", SUM(CASE WHEN "invocation_success" = true THEN 1 ELSE 0 END) AS "success_count", COUNT(*) AS "total_invocations", CAST(SUM(CASE WHEN "invocation_success" = true THEN 1 ELSE 0 END) AS DOUBLE) / NULLIF(COUNT(*), 0) * 100.0 AS "success_rate_pct" FROM "connect_datalake"."ai_agent" WHERE "creation_timestamp" >= CAST('2026-06-09' AS TIMESTAMP) * 1000 AND "instance_id" = '<YOUR_INSTANCE_ID>' AND "ai_agent_id" IS NOT NULL GROUP BY "ai_agent_name";

Tasa de transferencia de IA

Definición: Tasa de sesiones de IA que han pasado a manos de agentes humanos.

Tabla fuente: ai_session

SELECT SUM(CASE WHEN "is_handed_off" = true THEN 1 ELSE 0 END) AS "ai_handoffs", COUNT(*) AS "ai_involved_contacts", CAST(SUM(CASE WHEN "is_handed_off" = true THEN 1 ELSE 0 END) AS DOUBLE) / NULLIF(COUNT(*), 0) * 100.0 AS "handoff_rate_pct" FROM "connect_datalake"."ai_session" WHERE "creation_timestamp" >= CAST('2026-06-09' AS TIMESTAMP) * 1000 AND "instance_id" = '<YOUR_INSTANCE_ID>' AND "ai_session_id" IS NOT NULL;

Puntuaciones de calidad de IA

Definición: puntajes promedio de éxito, fidelidad e integridad de los goles.

Tabla fuente: ai_session

SELECT AVG("goal_success_rate") AS "avg_goal_success_rate", AVG("faithfulness_score") AS "avg_faithfulness_score", AVG("completeness_score") AS "avg_completeness_score" FROM "connect_datalake"."ai_session" WHERE "creation_timestamp" >= CAST('2026-06-09' AS TIMESTAMP) * 1000 AND "instance_id" = '<YOUR_INSTANCE_ID>' AND "goal_success_rate" IS NOT NULL;

Precisión de la herramienta de IA

Definición: puntuaciones de precisión para el uso, la selección y la utilización de los parámetros de las herramientas de IA.

Tabla fuente: ai_tool

SELECT "ai_tool_name", AVG("ai_tool_parameter_accuracy") AS "avg_parameter_accuracy", AVG("ai_tool_selection_accuracy") AS "avg_selection_accuracy", AVG("ai_tool_utilization_accuracy") AS "avg_use_accuracy" FROM "connect_datalake"."ai_tool" WHERE "creation_timestamp" >= CAST('2026-06-09' AS TIMESTAMP) * 1000 AND "instance_id" = '<YOUR_INSTANCE_ID>' AND "ai_tool_id" IS NOT NULL GROUP BY "ai_tool_name";

Métricas de flujo

Flujos iniciados

Definición: recuento de flujos que comenzaron a ejecutarse.

Tabla de origen: contact_flow_events

SELECT "flow_resource_id", "flow_type", COUNT(*) AS "flows_started" FROM "connect_datalake"."contact_flow_events" WHERE "start_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "start_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "flow_resource_id", "flow_type";

Porcentaje de resultados de flujo

Definición: Porcentaje de cada tipo de resultado de flujo.

Tabla fuente: contact_flow_events

WITH flow_counts AS ( SELECT "flow_resource_id", "flow_outcome", COUNT(*) AS "outcome_count", SUM(COUNT(*)) OVER (PARTITION BY "flow_resource_id") AS "total_completed" FROM "connect_datalake"."contact_flow_events" WHERE "start_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "start_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "end_timestamp" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "flow_resource_id", "flow_outcome" ) SELECT "flow_resource_id", "flow_outcome", "outcome_count", CAST("outcome_count" AS DOUBLE) / "total_completed" * 100.0 AS "outcome_pct" FROM flow_counts ORDER BY "flow_resource_id", "outcome_pct" DESC;

Tiempo promedio de flujo

Definición: duración media de las ejecuciones de flujo.

Tabla fuente: contact_flow_events

SELECT "flow_resource_id", AVG( date_diff('millisecond', "start_timestamp", "end_timestamp") ) / 1000.0 AS "avg_flow_time_sec" FROM "connect_datalake"."contact_flow_events" WHERE "start_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "start_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "end_timestamp" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "flow_resource_id";

Métricas de evaluación

Evaluaciones realizadas

Definición: número de evaluaciones presentadas.

Tabla fuente: contact_evaluation_record

SELECT COUNT(DISTINCT "evaluation_id") AS "evaluations_performed" FROM "connect_datalake"."contact_evaluation_record" WHERE "evaluation_submitted_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "evaluation_submitted_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "item_type" = 'Form' AND "to_delete" = false AND ("evaluation_type" IS NULL OR "evaluation_type" != 'calibration') AND "instance_id" = '<YOUR_INSTANCE_ID>';

Puntuación promedio de evaluación

Definición: puntuación media de evaluación entre las evaluaciones enviadas.

Tabla fuente: contact_evaluation_record

SELECT AVG("score") AS "avg_evaluation_score_pct" FROM "connect_datalake"."contact_evaluation_record" WHERE "evaluation_submitted_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "evaluation_submitted_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "item_type" = 'Form' AND "to_delete" = false AND ("evaluation_type" IS NULL OR "evaluation_type" != 'calibration') AND "instance_id" = '<YOUR_INSTANCE_ID>';

Porcentaje de fallos automáticos

Definición: Porcentaje de evaluaciones que provocaron errores automáticos.

Tabla de origen: contact_evaluation_record

SELECT CAST( COUNT(DISTINCT CASE WHEN "automatic_fail" = true THEN "evaluation_id" END) AS DOUBLE ) / NULLIF(COUNT(DISTINCT "evaluation_id"), 0) * 100.0 AS "automatic_fail_pct" FROM "connect_datalake"."contact_evaluation_record" WHERE "evaluation_submitted_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "evaluation_submitted_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "item_type" = 'Form' AND "to_delete" = false AND ("evaluation_type" IS NULL OR "evaluation_type" != 'calibration') AND "instance_id" = '<YOUR_INSTANCE_ID>';

Métricas de campañas externas

Contactos de la campaña

Definición: Recuento de contactos salientes de la campaña.

Tabla fuente: contact_record

SELECT "campaign_id", COUNT(*) AS "campaign_contacts" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "campaign_id" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "campaign_id";

Contestada por una persona

Definición: llamadas de campaña salientes relacionadas con un cliente real.

Tabla fuente: contact_record

SELECT "campaign_id", COUNT(*) AS "human_answered" FROM "connect_datalake"."contact_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "campaign_id" IS NOT NULL AND "answering_machine_detection_status" = 'HUMAN_ANSWERED' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "campaign_id";

Métricas de casos

Casos creados

Definición: Total de casos creados en un período de tiempo.

Tabla de origen: case_events

SELECT COUNT(DISTINCT "case_id") AS "cases_created" FROM "connect_datalake"."case_events" WHERE "event_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "event_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "event_type" = 'CASE.CREATED' AND "instance_id" = '<YOUR_INSTANCE_ID>';

Tiempo promedio de resolución de casos

Definición: tiempo promedio desde la creación del caso hasta su cierre.

Tabla fuente: case_events

SELECT AVG( date_diff('hour', "created_timestamp", "last_closed_timestamp") ) AS "avg_resolution_time_hours" FROM "connect_datalake"."case_events" WHERE "last_closed_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "last_closed_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "created_timestamp" IS NOT NULL AND "instance_id" = '<YOUR_INSTANCE_ID>';

Métricas de bots

Resultados de la conversación de bots

Definición: Desglose porcentual de los resultados de las conversaciones entre bots.

Tabla fuente: bot_conversations

WITH bot_outcomes AS ( SELECT "bot_id", "bot_conversation_outcome", COUNT(*) AS "cnt", SUM(COUNT(*)) OVER (PARTITION BY "bot_id") AS "total" FROM "connect_datalake"."bot_conversations" WHERE "bot_conversation_start_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "bot_conversation_start_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "bot_id", "bot_conversation_outcome" ) SELECT "bot_id", "bot_conversation_outcome", "cnt", CAST("cnt" AS DOUBLE) / "total" * 100.0 AS "outcome_pct" FROM bot_outcomes;

Patrones de consulta comunes

Los siguientes patrones muestran cómo combinar varias tablas de lagos de datos para crear paneles e informes completos.

Panel de resumen diario

Definición: métricas completas de las colas diarias, incluido el nivel de servicio.

Tabla fuente: contact_statistic_record

SELECT "queue_id", SUM("is_queued") AS "contacts_queued", SUM("is_handled") AS "contacts_handled", SUM("is_abandoned") AS "contacts_abandoned", AVG(CASE WHEN "is_handled" = 1 THEN "queue_answer_time_ms" END) / 1000.0 AS "avg_answer_time_sec", AVG(CASE WHEN "is_handled" = 1 THEN "handle_time_ms" END) / 1000.0 AS "avg_handle_time_sec", CAST(SUM(CASE WHEN "is_handled" = 1 AND "queue_answer_time_ms" <= 20000 THEN 1 ELSE 0 END) AS DOUBLE) / NULLIF(SUM("is_queued"), 0) * 100.0 AS "sl_20s_pct" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY "queue_id" ORDER BY "contacts_queued" DESC;

Análisis de tendencias por hora

Definición: tendencias del volumen de contactos y del nivel de servicio por hora.

Tabla fuente: contact_statistic_record

SELECT date_trunc('hour', "disconnect_timestamp") AS "hour", "queue_id", SUM("is_queued") AS "contacts_queued", SUM("is_handled") AS "contacts_handled", SUM("is_abandoned") AS "contacts_abandoned", CAST(SUM("is_abandoned") AS DOUBLE) / NULLIF(SUM("is_queued"), 0) * 100.0 AS "abandon_rate_pct", AVG(CASE WHEN "is_handled" = 1 THEN "handle_time_ms" END) / 1000.0 AS "aht_sec" FROM "connect_datalake"."contact_statistic_record" WHERE "disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND "disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND "instance_id" = '<YOUR_INSTANCE_ID>' GROUP BY date_trunc('hour', "disconnect_timestamp"), "queue_id" ORDER BY "hour";

El análisis conversacional enriqueció los contactos

Definición: enriquezca los registros de contactos con análisis conversacionales.

Tabla fuente: contact_record unida con contact_lens_conversational_analytics

SELECT cr."contact_id", cr."queue_id", cr."agent_id", cr."agent_interaction_duration_ms" / 1000.0 AS "interaction_sec", cl."talk_time_agent_ms" / 1000.0 AS "agent_talk_sec", cl."talk_time_customer_ms" / 1000.0 AS "customer_talk_sec", cl."sentiment_overall_score_agent", cl."sentiment_overall_score_customer" FROM "connect_datalake"."contact_record" cr JOIN "connect_datalake"."contact_lens_conversational_analytics" cl ON cr."contact_id" = cl."contact_id" AND cr."instance_id" = cl."instance_id" WHERE cr."disconnect_timestamp" >= TIMESTAMP '2026-06-09 00:00:00' AND cr."disconnect_timestamp" < TIMESTAMP '2026-06-10 00:00:00' AND cr."instance_id" = '<YOUR_INSTANCE_ID>' AND cr."channel" = 'VOICE';

Cumplimiento del cronograma de los agentes (nivel de actividad)

Definición: compara el estado de actividad real de un agente (desdeagent_statistic_record) con las actividades de los turnos programados (según las tablas de programación) para cada intervalo de tiempo de un día. Determina el cumplimiento por intervalo: IN (el agente estaba haciendo lo que tenía programado hacer) o OUT (no lo estaba haciendo).

Columnas de salida: agente, fecha, inicio, finalización, actividad programada, actividad real, estado de cumplimiento, duración

Tablas de origen:

  • staff_shifts— Turnos de agentes por día (última versión no eliminada)

  • staff_shift_activities— Bloques de actividades programadas dentro de cada turno

  • shift_activities— Búsqueda del nombre de la actividad (asigna el ARN a un nombre legible por humanos)

  • agent_statistic_record— Estado real del agente por intervalo

  • users— Nombre del agente y resolución de ARN

Lógica de adherencia (simplificada):

  • Programado como «Abierto»: el agente está conectado si el estado es Disponible, En contacto o ACW

  • «Pausa» programada: el agente está de visita si el estado es Pausa o Almuerzo

  • «Reunión» programada: el agente está activo si el estado es Entrenamiento o Reunión

  • De lo contrario, ¡FUERA

WITH latest_shift_versions AS ( -- Get the latest (non-deleted) shift version per shift_id SELECT shift_id, MAX(shift_version) AS max_version FROM "connect_datalake"."staff_shifts" WHERE is_deleted = false AND CAST(shift_start_timestamp AS DATE) = DATE '2026-06-10' -- SET REPORT DATE GROUP BY shift_id ), latest_shifts AS ( SELECT ss.shift_id, ss.agent_arn, ss.shift_start_timestamp, ss.shift_end_timestamp FROM "connect_datalake"."staff_shifts" ss INNER JOIN latest_shift_versions lsv ON ss.shift_id = lsv.shift_id AND ss.shift_version = lsv.max_version WHERE ss.is_deleted = false ), -- Get scheduled activity blocks with human-readable activity names scheduled_blocks AS ( SELECT ls.agent_arn, ssa.activity_start_timestamp, ssa.activity_end_timestamp, sa.shift_activity_name, CASE WHEN sa.shift_activity_name IN ('Work', 'Overtime') THEN 'Open' WHEN sa.shift_activity_name IN ('Break', 'Lunch') THEN 'Break' WHEN sa.shift_activity_name = 'Training' THEN 'Meeting' WHEN sa.shift_activity_name = 'PTO' THEN 'PTO' ELSE sa.shift_activity_name END AS scheduled_activity_label FROM "connect_datalake"."staff_shift_activities" ssa INNER JOIN latest_shifts ls ON ssa.shift_id = ls.shift_id INNER JOIN latest_shift_versions lsv ON ssa.shift_id = lsv.shift_id AND ssa.shift_version = lsv.max_version INNER JOIN "connect_datalake"."shift_activities" sa ON ssa.shift_activity_arn = sa.shift_activity_arn WHERE ssa.is_deleted = false ), -- Get actual agent state intervals for the day actual_states AS ( SELECT u.user_arn AS agent_arn, u.first_name, u.last_name, asr.interval_start_time, asr.interval_end_time, asr.agent_status_name, asr.online_time, asr.agent_idle_time, asr.agent_on_contact_time, asr.non_productive_time, CASE WHEN asr.agent_on_contact_time IS NOT NULL AND asr.agent_on_contact_time > 0 THEN 'On Inbound Call' WHEN asr.agent_idle_time IS NOT NULL AND asr.agent_idle_time > 0 THEN 'Available' WHEN asr.non_productive_time IS NOT NULL AND asr.non_productive_time > 0 THEN COALESCE(asr.agent_status_name, 'Non-Productive') WHEN asr.online_time IS NOT NULL AND asr.online_time > 0 THEN 'Available' ELSE COALESCE(asr.agent_status_name, 'Offline') END AS actual_activity_label FROM "connect_datalake"."agent_statistic_record" asr INNER JOIN "connect_datalake"."users" u ON asr.user_id = u.user_id WHERE asr.interval_start_time >= TIMESTAMP '2026-06-10 00:00:00' -- SET REPORT DATE (UTC) AND asr.interval_start_time < TIMESTAMP '2026-06-11 00:00:00' ), -- Join actual states with scheduled blocks activity_timeline AS ( SELECT act.first_name || ' ' || act.last_name AS agent_name, act.interval_start_time, act.interval_end_time, act.actual_activity_label, act.agent_status_name, COALESCE(sb.scheduled_activity_label, 'Open') AS scheduled_activity FROM actual_states act LEFT JOIN scheduled_blocks sb ON act.agent_arn = sb.agent_arn AND act.interval_start_time < sb.activity_end_timestamp AND act.interval_end_time > sb.activity_start_timestamp ) SELECT agent_name AS "AGENT", CAST(interval_start_time AS DATE) AS "DATE", DATE_FORMAT(interval_start_time, '%H:%i:%s') AS "BEGIN", DATE_FORMAT(interval_end_time, '%H:%i:%s') AS "END", scheduled_activity AS "SCHEDULED ACTIVITY", actual_activity_label AS "ACTUAL ACTIVITY", CASE WHEN scheduled_activity = 'Open' AND actual_activity_label IN ('Available', 'On Inbound Call', 'On Outbound Call', 'Call Ringing', 'Aftercall (ACW)') THEN 'IN' WHEN scheduled_activity = 'Break' AND agent_status_name IN ('Break', 'Lunch') THEN 'IN' WHEN scheduled_activity = 'Meeting' AND agent_status_name IN ('Training', 'Meeting') THEN 'IN' ELSE 'OUT' END AS "ADHERENCE STATE", CAST(DATE_DIFF('second', interval_start_time, interval_end_time) / 3600 AS VARCHAR) || ':' || LPAD(CAST((DATE_DIFF('second', interval_start_time, interval_end_time) % 3600) / 60 AS VARCHAR), 2, '0') || ':' || LPAD(CAST(DATE_DIFF('second', interval_start_time, interval_end_time) % 60 AS VARCHAR), 2, '0') AS "DURATION" FROM activity_timeline ORDER BY interval_start_time ASC;

Prácticas recomendadas

  • Reducción de particiones: incluya siempre filtros de partición (disconnect_timestamp,published_date, ocreation_timestamp) para minimizar los costos de escaneo.

  • Deduplicación: Connect Customer entrega los registros al menos una vez. DISTINCTUtilícelo en las claves principales cuando se requieran recuentos exactos.

  • Zonas horarias: todas las marcas horarias están en UTC. Solicita la AT TIME ZONE presentación de informes locales.

  • Milisegundos: la mayoría de los campos de duración se almacenan en milisegundos. Divida por 1000.0 para obtener segundos.

  • Filtro de ID de instancia: filtre siempre por instance_id en entornos de varias instancias.

  • Real-time métricas: para obtener métricas reales en tiempo real, usa la GetCurrentMetricData API. El lago de datos solo proporciona datos históricos.