View a markdown version of this page

Consultas de referencia para el lago de datos 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 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 del catálogo de Glue.

Sustitúyala <YOUR_INSTANCE_ID> en cada consulta por tu ID de instancia de Connect Customer.

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 de fuentes: 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: Recuento de contactos desconectados por el cliente mientras esperan en la cola.

Tabla de origen: 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: Recuento de contactos abandonados a los X segundos de haber sido puestos en cola.

Tabla fuente: 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 medio de espera de los contactos en la cola antes de abandonarlos.

Tabla fuente: 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 fuente: 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 fuente: 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: Recuento de contactos colocados en una cola.

Tabla de origen: 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: Recuento de contactos conectados a un agente.

Tabla de origen: 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 fuente: 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 fuente: 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 fuente: 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 fuente: 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 de los agentes

Tiempo promedio de gestión

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

Tabla fuente: 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 pasaron en espera después de conectarse con el agente.

Tabla fuente: 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 contactos en comparación con el tiempo disponible más activo.

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: Recuento 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 fuente: 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: El tiempo total durante el cual el agente CCP estuvo configurado en un estado distinto 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 medio que tarda un 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 medio que tardan los agentes 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 de mensajes totales 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 abandonó 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 fuente: 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 medio de espera más silencio por contacto de voz.

Tabla fuente: 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 del 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 del agente por contacto.

Tabla fuente: 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 fuente: 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 se ampliaron a 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 objetivos.

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 fuente: 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 de origen: 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 del 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 las evaluaciones presentadas.

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 activaron un error automático.

Tabla fuente: 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 de fuentes: 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 activo.

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 las conversaciones sobre 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 por hora y del nivel de servicio.

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";

Contactos enriquecidos con lentes de contacto

Definición: enriquezca los registros de contactos con el análisis de lentes de contacto.

Tabla fuente: contact_record unida a 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 agentes (nivel de actividad)

Definición: compara el estado de actividad real de un agente (desdeagent_statistic_record) con sus actividades de turno programadas (desde las tablas de programación) para cada intervalo de tiempo de un día. Realiza una determinación de adherencia por intervalo: IN (el agente estaba haciendo lo que tenía previsto hacer) o OUT (no lo estaba haciendo).

Columnas de salida: agente, fecha, inicio, fin, actividad programada, actividad real, estado de adherencia y duración

Tablas de origen:

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

  • staff_shift_activities— Bloques de actividad programados dentro de cada turno

  • shift_activities— Búsqueda de nombres de actividades (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á ACTIVO si el estado es Disponible, En contacto o ACW

  • «Pausa» programada: el agente está de acuerdo si el estado es Pausa o Comida

  • «Reunión» programada: el agente está de acuerdo si el estado es de formación o de 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

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

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

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

  • Milisegundos: la mayoría de los campos de duración se almacenan en milisegundos. Divida entre 1000,0 durante 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.