No lo es. Sinceramente, no sé cómo funcionó alguna vez. Publicaré una versión actualizada pronto y te avisaré cuando esté lista.
Editar: @IreneT
Aquí tienes una versión corregida de la consulta original. Ignoraría esa consulta y miraría las otras consultas que he publicado en esta respuesta. Hazme saber si tienes alguna pregunta sobre las consultas o si tienes algún problema al agregar los parámetros requeridos a las consultas. Según las pruebas de hoy, me doy cuenta de que tengo que actualizar la página después de guardar una consulta del Explorador de Datos para que los campos de entrada de parámetros aparezcan debajo de la consulta. (Eso puede ser solo una peculiaridad en mi sitio de desarrollo local).
-- [params]
-- int :months_ago = 1
WITH query_period AS (
SELECT
date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,
date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end
),
staff_responses AS (
SELECT
DISTINCT ON (p.topic_id)
p.topic_id,
p.created_at,
t.category_id,
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time
FROM posts p
JOIN topics t
ON t.id = p.topic_id
AND t.category_id = ANY ('{46,25,43,40,44,35,22,7,20,17,6,12}'::int[])
JOIN users u
ON u.id = p.user_id
WHERE p.post_number > 1
AND u.admin = 't' OR u.moderator = 't'
ORDER BY p.topic_id, p.created_at
),
user_topics AS (
SELECT
t.id
FROM topics t
JOIN users u
ON u.id = t.user_id
WHERE u.admin = 'f' AND u.moderator = 'f'
)
SELECT
sr.category_id,
AVG(sr.response_time) AS "Average First Response Time",
COUNT(1) AS "Topics Responded to"
FROM staff_responses sr
JOIN query_period qp
ON sr.created_at >= qp.period_start
AND sr.created_at <= qp.period_end
JOIN user_topics t
ON t.id = sr.topic_id
GROUP BY sr.category_id
Lo que se cambió fue:
--DATE_TRUNC('minute', p.created_at - t.created_at) AS response_time
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time
Me sorprendería si escribí la consulta antigua sin probarla. En cualquier caso, la versión actualizada funciona como se esperaba ahora.
Según recuerdo, esta consulta se escribió para un sitio específico y no estaba destinada a publicarse en Meta. Aquí hay un par de consultas más útiles para obtener información sobre los tiempos de respuesta del personal:
Tiempo de la primera respuesta grupal para temas creados dentro de un período de tiempo determinado
Devuelve el tiempo de la primera respuesta de un miembro de un grupo determinado a temas “regulares” (no Mensajes Personales) creados por un usuario que no es miembro del grupo determinado. El parámetro :group_name de la consulta se establece en “staff” por defecto. Con ese valor, dará el tiempo de la primera respuesta de los miembros del personal. Puedes cambiar el valor de ese parámetro para obtener los tiempos de respuesta de diferentes grupos. Por ejemplo, “customer_support”.
Tenga en cuenta que las fechas deben proporcionarse técnicamente en el formato aaaa-mm-dd, pero la consulta también aceptaría fechas en el formato dd-mm-aaaa.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
topic_id,
staff_user_id,
response_time_minutes
FROM group_response_times
WHERE row_num = 1
ORDER BY category_id, response_time_minutes
Tiempo promedio de la primera respuesta grupal por categoría:
Utiliza la misma lógica que la consulta anterior, pero devuelve el tiempo promedio de la primera respuesta de los miembros del grupo determinado por categoría para los temas creados por usuarios que no son miembros del grupo determinado dentro del período de tiempo establecido por los parámetros :start_date y :end_date. Al igual que con la consulta anterior, si el parámetro :group_name se deja en su valor predeterminado “staff”, devolverá los tiempos promedio de la primera respuesta del personal para temas regulares creados por usuarios que no son del personal.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
AVG (response_time_minutes) AS average_response_time_minutes,
COUNT(*) AS num_topics_with_staff_responses
FROM group_response_times
WHERE row_num = 1
GROUP BY category_id
@JammyDodger, tal vez reemplace la consulta en el OP con las dos últimas consultas en esta publicación. Además, probablemente actualice el título a algo como “Tiempo de la primera respuesta por miembros del grupo”.