Guide de référence des rapports du tableau de bord Admin

:bookmark: Ceci est un guide de référence décrivant le fonctionnement des rapports du tableau de bord Admin, les données qu’ils affichent, les requêtes SQL correspondantes de Data Explorer, et où trouver le code Ruby pour chaque rapport.

:person_raising_hand: Niveau d’utilisateur requis : Personnel

Discourse comprend plusieurs rapports intégrés dans le tableau de bord Admin qui peuvent être utiles pour explorer les statistiques d’une communauté. Pour accéder à ces rapports, vous pouvez visiter discourse.example.com/admin/dashboard/reports sur votre site (ou cliquer sur le lien Rapports en haut du tableau de bord). Notez que seuls les utilisateurs du personnel auront accès à ces rapports.

Les données de tous les utilisateurs d’un site sont incluses dans ces rapports (y compris l’activité du personnel, comme la visite des pages d’administration). La seule condition appliquée aux utilisateurs dans les rapports est qu’ils soient des utilisateurs « réels », ce qui permet d’exclure l’utilisateur system des rapports.

Les plugins peuvent également ajouter des rapports au tableau de bord avec add_report(name, &block).

:gem: Les modèles Ruby pour la plupart des rapports se trouvent à l’adresse : discourse/app/models/concerns/reports/. Certains rapports font également référence à : discourse/app/models/report.rb

:bulb: Les sujets dashboard-sql contiennent toutes les requêtes SQL correspondantes qui peuvent être utilisées pour générer des rapports identiques aux rapports du tableau de bord Admin. Ces requêtes peuvent être utilisées dans le plugin Data Explorer et pour exécuter des requêtes Data Explorer avec l’API Discourse

:wrench: Pour masquer des rapports spécifiques du tableau de bord, utilisez le paramètre de site dashboard_hidden_reports.

Solutions acceptées

Affiche le décompte quotidien des messages marqués comme solutions.

Code Ruby : discourse-solved/plugin.rb at main · discourse/discourse-solved · GitHub

Requête SQL : Dashboard Report - Accepted Solutions

Connexions administrateurs

Liste des heures de connexion des administrateurs avec les localisations.

Code Ruby : discourse/app/models/concerns/reports/staff_logins.rb

Requête SQL : Dashboard Report - Admin Logins

Anonymes

Nombre de nouvelles pages vues par des visiteurs non connectés à un compte.

Code Ruby : discourse/app/models/concerns/reports/consolidated_page_views.rb

Requête SQL : Dashboard Report - Anonymous

Favoris

Nombre de nouveaux sujets et messages ajoutés aux favoris.

Code Ruby : discourse/app/models/concerns/reports/bookmarks.rb

Requête SQL : Dashboard Report - Bookmarks

Requêtes API consolidées

Statistiques d’utilisation de l’API par date, suivies à la fois des requêtes API régulières et des requêtes API utilisateur.

Code Ruby : discourse/app/models/concerns/reports/consolidated_api_requests.rb at main · discourse/discourse · GitHub

Requête SQL : Dashboard Report - Consolidated API Requests

Pages vues consolidées

Pages vues pour les utilisateurs connectés, les utilisateurs anonymes et les robots. Il s’agit d’un rapport hérité remplacé par le rapport Trafic du site.

Code Ruby : discourse/app/models/concerns/reports/consolidated_page_views.rb

Requête SQL : Dashboard Report - Consolidated Pageviews

Pages vues consolidées avec détection du navigateur (Déprécié)

Pages vues pour les utilisateurs connectés, les utilisateurs anonymes, les robots connus et autres. Ce rapport est déprécié et délègue maintenant au rapport Trafic du site.

Code Ruby : discourse/app/models/concerns/reports/consolidated_page_views_browser_detection.rb

Requête SQL : Dashboard Report - Consolidated Pageviews with Browser Detection

DAU/MAU

Nombre de membres connectés au cours des dernières 24 heures divisé par le nombre de membres connectés au cours du dernier mois – renvoie un pourcentage qui indique la « fidélité » de la communauté. Visez >20 %.

Code Ruby : discourse/app/models/concerns/reports/dau_by_mau.rb

Requête SQL : Dashboard Report - DAU/MAU

Utilisateurs engagés quotidiens

Nombre d’utilisateurs ayant aimé ou publié au cours des dernières 24 heures.

Code Ruby : discourse/app/models/concerns/reports/daily_engaged_users.rb

Requête SQL : Dashboard Report - Daily Engaged Users

E-mails envoyés

Nombre de nouveaux e-mails envoyés.

Code Ruby : discourse/app/models/concerns/reports/emails.rb

Requête SQL : Dashboard Report - Emails Sent

Signalements

Nombre de nouveaux signalements.

Code Ruby : discourse/app/models/concerns/reports/flags.rb

Requête SQL : Dashboard Report - Flags

Statut des signalements

Liste des statuts des signalements, y compris le type de signalement, l’auteur du message, la personne ayant signalé et le temps de résolution.

Code Ruby : discourse/app/models/concerns/reports/flags_status.rb

Requête SQL : Dashboard Report - Flags Status

J’aime

Nombre de nouveaux « J’aime ».

Code Ruby : discourse/app/models/concerns/reports/likes.rb

Requête SQL : Dashboard Report - Likes

Connecté

Nombre de nouvelles pages vues par les utilisateurs connectés.

Code Ruby : discourse/app/controllers/admin/reports_controller.rb#L5

Requête SQL : Dashboard Report - Logged In

Activité des modérateurs

Liste de l’activité des modérateurs, y compris les signalements examinés, le temps de lecture, les sujets créés, les messages créés, les messages privés créés et les révisions.

Requête SQL : Dashboard Report - Moderator Activity

Avertissement des modérateurs

Nombre d’avertissements envoyés par messages privés par les modérateurs.

Code Ruby : discourse/app/models/concerns/reports/moderator_warning_private_messages.rb

Requête SQL : Dashboard Report - Moderator Warnings

Nouveaux contributeurs

Nombre d’utilisateurs ayant publié leur premier message au cours de cette période.

Code Ruby : discourse/app/models/concerns/reports/new_contributors.rb

Requête SQL : Dashboard Report - New Contributors

Notifier les modérateurs

Nombre de fois où les modérateurs ont été notifiés par message privé suite à un signalement.

Code Ruby : discourse/app/models/concerns/reports/notify_moderators_private_messages.rb

Requête SQL : Dashboard Report - Notify Moderators

Notifier l’utilisateur

Nombre de fois où les utilisateurs ont été notifiés par message privé suite à un signalement.

Code Ruby : discourse/app/models/concerns/reports/notify_user_private_messages.rb

Requête SQL : Dashboard Report - Notify User

Sentiment global

Nombre de messages classés soit positifs soit négatifs avec l’IA « Sentiment », sur une période spécifiée.

Code Ruby : discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

Requête SQL : Rapport de tableau de bord - Sentiment global

Pages vues

Nombre de nouvelles pages vues par tous les visiteurs. Identique au total des pages vues consolidées.

Discourse utilise la requête suivante pour déterminer le nombre total de pages vues :

Requête SQL : Dashboard Report - Consolidated Pageviews

Éditions de messages

Nombre de nouvelles éditions de messages.

Code Ruby : discourse/app/models/concerns/reports/post_edits.rb

Requête SQL : Dashboard Report - Post Edits

Messages

Nouveaux messages créés au cours de la période sélectionnée

Code Ruby : discourse/app/models/concerns/reports/posts.rb

Requête SQL : Dashboard Report - Posts

Émotion des messages

Nombre de messages classés par IA avec l’une des émotions suivantes : Tristesse, Surprise, Peur, Colère, Joie, Dégoût – regroupés par niveau de confiance de l’auteur, sur une période spécifiée.

Code Ruby : discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

Requête SQL : Rapport de tableau de bord - Émotion des messages

Réactions

Liste des réactions les plus récentes.

Code Ruby : discourse-reactions/plugin.rb at main · discourse/discourse-reactions · GitHub

Requête SQL : Dashboard Report - Reactions

Inscriptions

Nouvelles inscriptions de comptes pour cette période.

Code Ruby : discourse/app/models/concerns/reports/signups.rb

Requête SQL : Dashboard Report - Signups

Trafic du site

Pages vues pour les navigateurs connectés, les navigateurs anonymes, les robots et autres trafic. Il s’agit du rapport de trafic principal, remplaçant les anciens rapports de pages vues consolidées.

Code Ruby : discourse/app/models/concerns/reports/site_traffic.rb

Requête SQL : Rapport de tableau de bord - Trafic du site

Connexions suspectes

Détails des nouvelles connexions qui diffèrent de manière suspecte des connexions précédentes.

Code Ruby : discourse/app/models/concerns/reports/suspicious_logins.rb

Requête SQL : Dashboard Report - Suspicious Logins

Système

Nombre de messages privés envoyés automatiquement par le Système.

Code Ruby : discourse/app/models/concerns/reports/system_private_messages.rb

Requête SQL : Dashboard Report - System

Temps de première réponse

Temps moyen (en heures) de la première réponse aux nouveaux sujets.

Code Ruby : discourse/app/models/concerns/reports/time_to_first_response.rb + discourse/discourse/blob/main/app/models/topic.rb#L1799-L1844

Requête SQL : Dashboard Report - Time to First Response

Utilisateurs ignorés/mis en sourdine en tête

Utilisateurs qui ont été mis en sourdine et/ou ignorés par de nombreux autres utilisateurs.

Code Ruby : discourse/app/models/concerns/reports/top_ignored_users.rb

Requête SQL : Dashboard Report - Top Ignored / Muted Users

Sujets les plus référencés

Sujets ayant reçu le plus de clics provenant de sources externes.

Code Ruby : discourse/app/models/concerns/reports/top_referred_topics.rb

Requête SQL : Dashboard Report - Top Referred Topics

Meilleurs référents

Utilisateurs classés par nombre de clics sur les liens qu’ils ont partagés.

Code Ruby : discourse/app/models/concerns/reports/top_referrers.rb

Requête SQL : Dashboard Report - Top Referrers

Principales sources de trafic

Sources externes qui ont le plus lié vers ce site.

Code Ruby : discourse/app/models/concerns/reports/top_traffic_sources.rb

Requête SQL : Dashboard Report - Top Traffic Sources

Meilleurs fichiers joints

Liste de tous les fichiers joints par extension, taille et auteur.

Code Ruby : discourse/app/models/concerns/reports/top_uploads.rb

Requête SQL : Dashboard Report - Top Uploads

Meilleurs utilisateurs par nombre de « J’aime » reçus

10 meilleurs utilisateurs ayant reçu des « J’aime ».

Code Ruby : discourse/app/models/concerns/reports/top_users_by_likes_received.rb

Requête SQL : Dashboard Report - Top Users by Likes Received

Meilleurs utilisateurs par nombre de « J’aime » reçus d’un utilisateur avec un niveau de confiance inférieur

10 meilleurs utilisateurs d’un niveau de confiance supérieur ayant reçu des « J’aime » de la part de personnes d’un niveau de confiance inférieur.

Code Ruby : discourse/app/models/concerns/reports/top_users_by_likes_received_from_inferior_trust_level.rb

Requête SQL : Dashboard Report - Top Users by Likes Received from a User with a Lower Trust Level

Meilleurs utilisateurs par nombre de « J’aime » reçus d’une variété de personnes

10 meilleurs utilisateurs ayant reçu des « J’aime » d’un large éventail de personnes.

Code Ruby : discourse/app/models/concerns/reports/top_users_by_likes_received_from_a_variety_of_people.rb

Requête SQL : Dashboard Report - Top Users by Likes Received From a Variety of People

Sujets

Nouveaux sujets créés au cours de cette période.

Code Ruby : discourse/app/models/concerns/reports/topics.rb

Requête SQL : Dashboard Report - Topics

Sujets sans réponse

Nombre de nouveaux sujets créés qui n’ont pas reçu de réponse.

Code Ruby : discourse/app/models/concerns/reports/topics_with_no_response.rb

Requête SQL : Dashboard Report - Topics with No Response

Statistiques de vue des sujets

100 meilleurs sujets par nombre de vues avec ventilation anonymes et connectés, filtrable par catégorie.

Code Ruby : discourse/app/models/concerns/reports/topic_view_stats.rb

Requête SQL : Rapport de tableau de bord - Statistiques de vue des sujets

Termes de recherche tendance

Termes de recherche les plus populaires avec leurs taux de clics.

Code Ruby : discourse/app/models/concerns/reports/trending_search.rb

Requête SQL : Dashboard Report - Trending Search Terms

Croissance du niveau de confiance

Nombre d’utilisateurs ayant augmenté leur niveau de confiance au cours de cette période.

Le rapport de croissance du niveau de confiance extrait les données de la table user_histories dans la base de données Discourse. Plus précisément, ce rapport compte le nombre de fois où une user_histories.action est enregistrée pour une augmentation du niveau de confiance d’un utilisateur.

Code Ruby : discourse/app/models/concerns/reports/trust_level_growth.rb

Requête SQL : Dashboard Report - Trust Level Growth

Politiques non acceptées

Ce rapport de tableau de bord identifie les sujets contenant des politiques qui n’ont pas été acceptées par certains utilisateurs.

Code Ruby : discourse-policy/plugin.rb at main · discourse/discourse-policy · GitHub

Requête SQL : Dashboard Report - Unaccepted Policies

Ratio de signalement des utilisateurs

Liste des utilisateurs classés par ratio de réponse du personnel à leurs signalements (désaccord vs accord).

Code Ruby : discourse/app/models/concerns/reports/user_flagging_ratio.rb

Requête SQL : Dashboard Report - User Flagging Ratio

Notes utilisateur

Liste des notes utilisateur les plus récentes.

Code Ruby : discourse-user-notes/plugin.rb at main · discourse/discourse-user-notes · GitHub

Requête SQL : Dashboard Report - User Notes

Vues de profil utilisateur

Total des nouvelles vues de profils d’utilisateurs.

Code Ruby : discourse/app/models/concerns/reports/profile_views.rb

Requête SQL : Dashboard Report - User Profile Views

Visites utilisateur

Nombre total de visites d’utilisateurs connectés sur le forum pour la période sélectionnée (aujourd’hui, hier, derniers 7 jours, etc.).

Une visite utilisateur est comptée chaque fois qu’un utilisateur connecté unique visite le site, jusqu’à une fois par jour. Par exemple, si un utilisateur visite un site tous les jours pendant une semaine, Discourse comptera cela comme 7 visites utilisateur.

Code Ruby : discourse/app/models/concerns/reports/visits.rb

Requête SQL : Dashboard Report - User Visits

Visites utilisateur (mobile)

Nombre d’utilisateurs connectés uniques ayant visité via un appareil mobile.

Code Ruby : discourse/app/models/concerns/reports/mobile_visits.rb

Requête SQL : Dashboard Report - User Visits

Utilisateur à Utilisateur (excluant les réponses)

Nombre de nouveaux messages privés initiés.

Code Ruby : discourse/app/models/concerns/reports/user_to_user_private_messages.rb

Requête SQL : Dashboard Report - User-to-User

Utilisateur à Utilisateur (avec réponses)

Nombre de tous les nouveaux messages privés et réponses.

Code Ruby : discourse/app/models/concerns/reports/user_to_user_private_messages_with_replies.rb

Requête SQL : Dashboard Report - User-to-User

Utilisateurs par niveau de confiance

Nombre d’utilisateurs regroupés par niveau de confiance.

Code Ruby : discourse/app/models/concerns/reports/users_by_trust_level.rb

Requête SQL : Dashboard Report - Users Per Trust Level

Utilisateurs par type

Nombre d’utilisateurs regroupés par administrateur, modérateur, suspendu et silencieux.

Code Ruby : discourse/app/models/concerns/reports/users_by_type.rb

Requête SQL : Dashboard Report - Users Per Type

Pages vues par les robots d’exploration web

Total des pages vues par les robots d’exploration web au fil du temps.

Code Ruby : discourse/app/models/report.rb

Requête SQL : Dashboard Report - Web Crawler Pageviews

Agents utilisateur des robots d’exploration web

Liste des agents utilisateur des robots d’exploration web, triés par nombre de pages vues.

Code Ruby : discourse/app/models/concerns/reports/web_crawlers.rb

Requête SQL : Dashboard Report - Web Crawler User Agents

18 « J'aime »

Je ne vois pas de lien vers cela sur /admin. Est-ce que je ne lis pas bien ? Cela devrait être plus facile à trouver. Je pense que je savais que ces rapports existaient mais je n’ai pas réussi à les trouver.

Bien que cela m’ait pris seulement quelques minutes pour les trouver, il serait peut-être agréable d’ajouter quelque chose comme

3 « J'aime »

Ouais, ce serait bien dans un MP au personnel pour les mentionner lorsqu’un site est créé. :thinking:

1 « J'aime »

:crying_cat_face:

Désolé. Je pensais vraiment l’avoir déjà vu quelque part.

On n’arrive pas à faire lire les choses aux gens. . . . Sauf que je pouvais lire le code source pour savoir comment le faire dans un plugin ?

Mais peut-être mettre à jour ce qui précède avec

Je pense que c’est ce qui m’a vraiment dérouté. (Mais non, je n’ai pas d’excuse.)

J’ai fait du sujet un wiki, allez-y ! :+1:

2 « J'aime »

Cela ne correspond pas à l’interface utilisateur (l’interface utilisateur utilise 20 %), laquelle devrait-elle être ?

2 « J'aime »

Bien vu. Il a été récemment mis à jour à 20 %. Je vais apporter la modification dans le message d’origine. :slight_smile: :+1:

2 « J'aime »

Salut @SaraDev Ce résultat de rapport peut-il être obtenu avec une requête SQL ? Pouvez-vous la partager ?
Merci

1 « J'aime »

Oui, vous pouvez utiliser le rapport SQL suivant pour les principales sources de trafic :

-- [params]
-- date :start_date = 01/05/2023
-- date :end_date = 03/06/2023

WITH count_links AS (

SELECT COUNT(*) AS clicks,
       ind.name AS domain
FROM incoming_links il
  INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
  INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
  INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
  INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at::date BETWEEN :start_date AND :end_date
GROUP BY ind.name
ORDER BY clicks DESC
),

count_topics AS (

SELECT COUNT(DISTINCT p.topic_id) AS topics,
       ind.name AS domain
FROM incoming_links il
INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at > (CURRENT_TIMESTAMP - INTERVAL '30 DAYS')
GROUP BY ind.name
)

SELECT cl.domain,
       cl.clicks AS "Clicks",
       ct.topics AS "Topics"
FROM count_links cl
JOIN count_topics ct ON cl.domain = ct.domain
LIMIT 10

Avec cette requête, notez que les paramètres de date acceptent les dates au format jour/mois/année.

1 « J'aime »

Bonjour @SaraDev, merci d’avoir partagé la requête.
Une question plus générale concernant ce rapport, et la table incoming_links en fait : elle ne représente que le trafic des pages de publication et non le trafic de toutes les pages du forum, n’est-ce pas ?

Contexte : Je cherche à analyser les tendances du trafic global du forum et j’espérais obtenir le trafic global par sources à partir du rapport des principales sources de trafic.
Mais alors que le trafic global est d’environ 272 K le mois dernier (utilisateurs et anonymes), le total des clics dans le rapport des sources de trafic pour la même période n’est que de 59 K.
De plus, je vois que vous utilisez une jointure interne avec les tables topics et posts, ce qui signifie que si aucun post_id n’est associé au clic, vous ne le comptez pas.

Pouvez-vous confirmer ma conclusion et peut-être expliquer un peu la logique derrière la table incoming_links ?

Salut @SaraDev J’ai exécuté cette requête et le résultat ne correspond pas exactement au rapport Posts dans l’onglet général.
Par exemple pour le 30 novembre :
Requête = 112 messages
Rapport = 120 messages
Pouvez-vous s’il vous plaît vérifier l’écart ?
Merci

1 « J'aime »

Juste pour information @Yotam_Hagay - même si Sara est l’auteure originale, le guide est la responsabilité de tout le monde :slight_smile: :discourse: Il n’est pas nécessaire de mentionner @ tout le monde sur chaque publication. :slight_smile:

2 « J'aime »

Merci @JammyDodger pour ces précisions.
Y a-t-il quelqu’un d’autre que je puisse mentionner ou vers qui me tourner pour obtenir une réponse ?

1 « J'aime »

Les résultats de cette requête sont légèrement différents de ceux du rapport « Temps de réponse » :
Le 8 novembre, par exemple :
Requête : 93 heures
Rapport : 116 heures
Quelqu’un peut-il me conseiller ?

1 « J'aime »

Je pense que certaines de ces recherches prendront du temps. Je regarde moi-même pour voir si je peux comprendre ce qui se passe (bien que l’écart entre mes compétences en SQL et mes compétences en Ruby soit assez grand :slight_smile:).

Mais continuez à partager vos découvertes, car ce serait formidable de consolider toutes ces informations. :+1:

2 « J'aime »

Pour celui des Posts, je pense que le rapport stock compte également les messages de sujet ainsi que ceux des utilisateurs système, mais cible uniquement ceux avec post_type 1 (c’est-à-dire pas les murmures, les petits messages d’action ou les actions de modérateur).

Je pense que le SQL ressemblerait plutôt à ceci :

--[params]
-- date :start_date
-- date :end_date

SELECT 
    p.created_at::date AS "Jour",
    COUNT(p.id) AS "Nombre"
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id AND t.deleted_at ISNULL
WHERE p.created_at::date BETWEEN :start_date AND :end_date
    AND p.deleted_at ISNULL
    AND t.archetype = 'regular'
    AND p.post_type = 1
GROUP BY p.created_at::date
ORDER BY 1

Pourriez-vous exécuter cela sur votre site et voir si cela correspond ?

2 « J'aime »

Merci Jammy, je vais vérifier !
Je travaille actuellement sur une analyse du délai de première réponse, donc j’apprécierais si vous pouviez jeter un œil à celle-ci également.

1 « J'aime »

En examinant la version SQL, je pense qu’il manque le AND p.user_id <> t.user_id pour exclure les réponses de l’OP. Si je l’ajoute, cela me donne le temps précis entre l’OP et la première réponse de quelqu’un d’autre :

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT 
        p.topic_id, 
        MIN(post_number) post_number, 
        t.created_at
    FROM posts p
    INNER JOIN topics t ON (p.topic_id = t.id)
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_number != 1
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
    ORDER BY 2 DESC
)

SELECT 
    p.topic_id, 
    fr.created_at::date dt_topic_created,
    (p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr 
    ON fr.topic_id = p.topic_id 
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
ORDER BY response_time

Je pense aussi que le rapport des stocks est en décimal plutôt qu’en heures et minutes comme le SQL. Je vais essayer de nouveau pour qu’il corresponde. :+1:


Juste une petite mise à jour pour inclure la AVG afin qu’elle soit plus similaire à la sortie du rapport des stocks :

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT 
        p.topic_id, 
        MIN(post_number) post_number, 
        t.created_at
    FROM posts p
    INNER JOIN topics t ON p.topic_id = t.id
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
)

SELECT 
    fr.created_at::date dt_topic_created,
    AVG(p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr 
    ON fr.topic_id = p.topic_id 
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
GROUP BY fr.created_at::date
ORDER BY response_time

Cela semble correspondre au rapport des stocks, à condition de tenir compte du fait que l’un est en décimal et l’autre en HH:MM. Je suis sûr qu’il existe un moyen de convertir le response_time SQL en décimal, mais le HH:MM semble être une manière plus intuitive de le faire. (Je pense qu’il y a aussi des critères supplémentaires qui ne sont peut-être pas nécessaires, mais qui pourraient aussi servir de garde-fou contre des circonstances inhabituelles, j’ai donc finalement laissé ces parties telles quelles jusqu’à ce que je puisse le dire avec certitude :slight_smile:)

Pourriez-vous exécuter celui-ci et voir comment il correspond ?

4 « J'aime »

Oui, cela correspond maintenant aux chiffres indiqués dans le rapport de stock, merci !
Juste un commentaire -
J’ai constaté que la fonction AVG ci-dessous renvoie des résultats manquants si le temps est > 24h (une section de # de jours est manquante, je suppose).

AVG(p.created_at - fr.created_at)::time response_time

1 « J'aime »

Ah oui, caster en time était un mauvais choix. :slight_smile: Si vous supprimez le ::time, cela reviendra à la version plus précise (bien que plus difficile à lire).

Je vais également modifier celui ci-dessus. :+1:

2 « J'aime »