Il ne l’est pas. Franchement, je ne suis pas sûr que cela ait jamais fonctionné. Je publierai bientôt une version mise à jour et je vous mentionnerai pour vous faire savoir qu’elle est prête.
Modifier : @IreneT
Voici une version corrigée de la requête d’origine. J’ignorerais cette requête et regarderais les autres requêtes que j’ai publiées dans cette réponse à la place. Faites-moi savoir si vous avez des questions sur les requêtes, ou si vous rencontrez des problèmes pour ajouter les paramètres requis aux requêtes. D’après les tests d’aujourd’hui, je constate que je dois actualiser la page après avoir enregistré une requête Data Explorer pour que les champs de saisie des paramètres s’affichent sous la requête. (Cela peut être juste une particularité de mon site de développement 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
Ce qui a été changé :
--DATE_TRUNC('minute', p.created_at - t.created_at) AS response_time
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time
Je serais surpris si j’avais écrit l’ancienne requête sans la tester. Quoi qu’il en soit, la version mise à jour fonctionne comme prévu maintenant.
De mémoire, cette requête a été écrite pour un site spécifique et n’était pas destinée à être publiée sur Meta. Voici quelques requêtes plus utiles pour obtenir des informations sur les temps de réponse du personnel :
Temps de première réponse de groupe pour les sujets créés dans une période donnée
Retourne le temps de première réponse d’un membre d’un groupe donné aux sujets « réguliers » (pas de message personnel) créés par un utilisateur qui n’est pas membre du groupe donné. Le paramètre :group_name de la requête est défini sur « staff » par défaut. Avec cette valeur, il donnera le temps de première réponse des membres du personnel. Vous pouvez modifier la valeur de ce paramètre pour obtenir les temps de réponse de différents groupes. Par exemple, « customer_support ».
Notez que les dates doivent techniquement être fournies sous la forme aaaa-mm-jj, mais la requête accepterait également les dates sous la forme jj-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
Temps moyen de première réponse de groupe par catégorie :
Utilise la même logique que la requête précédente, mais retourne le temps moyen de la première réponse des membres du groupe donné par catégorie pour les sujets créés par des utilisateurs qui ne sont pas membres du groupe donné dans la période définie par les paramètres :start_date et :end_date. Comme pour la requête précédente, si le paramètre :group_name est laissé à sa valeur par défaut « staff », il retournera les temps moyens de première réponse du personnel pour les sujets réguliers créés par des utilisateurs non-staff.
-- [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, peut-être remplacer la requête dans l’OP par les deux dernières requêtes de ce post. De plus, probablement mettre à jour le titre pour quelque chose comme « Temps de première réponse par les membres du groupe ».