Este es un informe de panel SQL para el Tiempo de Primera Respuesta.
Este informe de panel proporciona información sobre el tiempo de respuesta promedio a los temas dentro de un rango de fechas especificado. El informe calcula el tiempo que se tarda en publicar la primera respuesta por parte de alguien que no sea el creador del tema.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-12-31
-- null category_id :category_id
-- boolean :include_subcategories = false
-- null user_id :user_ids
-- Tiempo de primera respuesta por fecha
SELECT
t.created_at AS "date",
CAST(AVG(t.hours)::numeric(10,2) AS float) AS "response_time_hours"
FROM (
SELECT
t.id,
t.created_at::date AS created_at,
EXTRACT(EPOCH FROM MIN(p.created_at) - t.created_at)::float / 3600.0 AS "hours"
FROM topics t
JOIN posts p ON p.topic_id = t.id
WHERE
t.created_at >= :start_date
AND t.created_at < :end_date
AND t.archetype <> 'private_message'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND p.post_number > 1
AND p.user_id != t.user_id
AND p.post_type = 1 -- Tipo de publicación regular
AND EXTRACT(EPOCH FROM p.created_at - t.created_at) > 0
AND (:category_id IS NULL OR
CASE WHEN :include_subcategories THEN
t.category_id IN (
WITH RECURSIVE subcategories AS (
SELECT id FROM categories WHERE id = :category_id
UNION
SELECT c.id FROM categories c
JOIN subcategories sc ON sc.id = c.parent_category_id
)
SELECT id FROM subcategories
)
ELSE
t.category_id = :category_id
END
)
AND (:user_ids IS NULL OR p.user_id IN (SELECT unnest(string_to_array(:user_ids, ','))::int))
GROUP BY t.id
) t
GROUP BY t.created_at
ORDER BY t.created_at
Explicación de la consulta SQL
Este informe mide la rapidez con la que los temas reciben su primera respuesta significativa al:
- Calcular el tiempo de respuesta: Para cada tema, encuentra la primera publicación que:
- No es del creador original del tema.
- Tiene un número de publicación > 1 (no es la publicación inicial).
- Es una publicación regular (tipo de publicación = 1).
- Se creó después del tema (diferencia de tiempo positiva).
- No ha sido eliminada.
- Agrupar por fecha: Agrega estos tiempos de respuesta por la fecha en que se creó el tema.
- Los resultados muestran:
- “date”: La fecha en que se crearon los temas.
- “hours”: Tiempo promedio (en horas) hasta la primera respuesta para los temas creados en esa fecha.
- Exclusiones:
- Se excluyen los mensajes privados.
- Se excluyen los temas y las publicaciones eliminadas.
- Se excluyen las respuestas propias.
Parámetros
:start_date(fecha) - formatoYYYY-MM-DD- Fecha de inicio del período del informe.
- Solo se incluirán los temas creados en o después de esta fecha.
:end_date(fecha) - formatoYYYY-MM-DD- Fecha de finalización del período del informe.
- Solo se incluirán los temas creados antes de esta fecha.
:category_id(category_id, anulable)- Cuando se proporciona, filtra los resultados a una categoría específica.
- Cuando es nulo, incluye temas de todas las categorías.
:include_subcategories(booleano) - Predeterminado: false- Cuando es verdadero Y se proporciona un
category_id, incluye temas de todas las subcategorías. - Cuando es falso, solo incluye temas de la categoría especificada exacta.
- Cuando es verdadero Y se proporciona un
:user_ids(user_id, anulable)- Cuando se proporciona, solo incluye respuestas de usuarios específicos.
- Cuando es nulo, incluye respuestas de todos los usuarios.
- Puede aceptar varios IDs de usuario como una lista separada por comas.
Resultados de ejemplo
| date | response_time_hours |
|---|---|
| 2023-11-12 | 29.87 |
| 2023-11-13 | 81.52 |
| 2023-11-14 | 5.17 |
| 2023-11-15 | 6.51 |
| 2023-11-16 | 7.75 |
| … | … |