Tableau de bord - Réactions

Ceci est une version SQL du rapport de tableau de bord pour les réactions.

Ce rapport fournit un décompte quotidien de tous les likes et réactions aux publications sur un site sur une période spécifiée.

Ce rapport aide à fournir un aperçu de l’engagement des utilisateurs au sein d’une communauté Discourse en mesurant la fréquence des différents emojis de réaction et des likes sur les publications. En analysant l’utilisation des différents emojis de réaction, les administrateurs peuvent obtenir des informations sur la fréquence à laquelle les utilisateurs interagissent avec le contenu, les réponses émotionnelles des utilisateurs aux publications, et identifier les emojis de réaction populaires et sous-utilisés.

:information_source: Ce rapport nécessite que le plugin Discourse Reactions soit activé sur votre site. Les réactions disponibles dans le rapport dépendront des réactions spécifiques qui ont été activées avec le paramètre de site discourse_reactions_enabled_reactions.

-- [params]
-- date :start_date = 2023-12-16
-- date :end_date = 2024-01-17
 
SELECT
  r.day,
  COALESCE(l.likes_count, 0) as likes_count,
  sum(case when reaction_value = 'laughing' then reactions_count else 0 end)::int as laughing,
  sum(case when reaction_value = 'cry' then reactions_count else 0 end)::int as cry,
  sum(case when reaction_value = 'exploding_head' then reactions_count else 0 end)::int as exploding_head,
  sum(case when reaction_value = 'clap' then reactions_count else 0 end)::int as clap,
  sum(case when reaction_value = 'confetti_ball' then reactions_count else 0 end)::int as confetti_ball,
  sum(case when reaction_value = 'hugs' then reactions_count else 0 end)::int as hugs,
  sum(case when reaction_value = 'chefs_kiss' then reactions_count else 0 end)::int as chefs_kiss,
  sum(case when reaction_value = '100' then reactions_count else 0 end)::int as one_hundred,
  sum(case when reaction_value = '+1' then reactions_count else 0 end)::int as plus_one,
  sum(case when reaction_value = 'rocket' then reactions_count else 0 end)::int as rocket,
  sum(case when reaction_value = 'star_struck' then reactions_count else 0 end)::int as star_struck,
  sum(case when reaction_value = 'eyes' then reactions_count else 0 end)::int as eyes,
  sum(case when reaction_value = 'discourse' then reactions_count else 0 end)::int as discourse
FROM (
  SELECT
    date_trunc('day', drru.created_at)::date as day,
    drr.reaction_value,
    count(drru.id) as reactions_count
  FROM discourse_reactions_reactions as drr
  LEFT OUTER JOIN discourse_reactions_reaction_users as drru on drr.id = drru.reaction_id
  WHERE drr.reaction_users_count IS NOT NULL
  AND drru.created_at::date >= :start_date::date AND drru.created_at::date <= :end_date::date
  GROUP BY drr.reaction_value, day
) r
LEFT JOIN (
  SELECT
    count(pa.id) as likes_count,
    date_trunc('day', pa.created_at)::date as day
  FROM post_actions as pa
  WHERE pa.post_action_type_id = 2 
  AND pa.created_at::date >= :start_date::date AND pa.created_at::date <= :end_date::date 
  GROUP BY day
) l ON r.day = l.day
GROUP BY r.day, l.likes_count
ORDER BY r.day

Explication de la requête SQL

Paramètres

  • La requête accepte deux paramètres, :start_date et :end_date, qui définissent la plage de dates pour le rapport. Les deux paramètres de date acceptent le format de date AAAA-MM-JJ.

Structure de la requête

  • Requête interne (Réactions) : La requête commence par une sous-requête qui sélectionne la date (day), le type de réaction (reaction_value) et le nombre de réactions (reactions_count) à partir de la table discourse_reactions_reactions jointe avec discourse_reactions_reaction_users sur le reaction_id. Cette jointure garantit que nous prenons en compte les réactions spécifiques à l’utilisateur.
  • Agrégation par types de réactions : Les données sélectionnées sont ensuite regroupées par day et reaction_value, en limitant la plage aux dates de début et de fin sélectionnées. Ceci est utilisé pour calculer le nombre total de chaque type de réaction pour chaque jour dans la plage de dates spécifiée.
  • Tri des totaux de réactions : Pour chaque type de réaction, la requête utilise une instruction CASE pour agréger le nombre de fois où la réaction spécifique est utilisée et convertit le résultat en entier pour un décompte précis.
    • Vous devrez peut-être ajuster reaction_value = '...' dans cette section en fonction des réactions activées sur votre site.
  • Sous-requête pour le nombre de likes : Une sous-requête distincte est utilisée pour calculer le nombre total de likes (likes_count) pour chaque jour en utilisant la table post_actionspost_action_type_id correspond aux likes.
  • Combinaison des données : La requête externe combine ensuite le décompte des likes avec les décomptes de réactions en joignant sur le champ day.
  • Sélection finale : La requête SELECT la plus externe génère la sortie finale avec le day, le nombre de likes (likes_count) et les décomptes de chaque type de réaction. S’il n’y a pas de données pour les likes un jour donné, la fonction COALESCE garantit qu’un zéro est affiché au lieu de NULL.
  • Tri des résultats : Les résultats sont triés par date (r.day) pour créer une série chronologique de l’engagement sur le site.

Colonnes

  • day : La date à laquelle les réactions et les likes ont été comptés.
  • likes_count : Nombre total de likes pour chaque jour.
  • Chaque type de réaction (rire, pleurer, tête qui explose, etc.) : Colonnes individuelles montrant le nombre total de chaque type de réaction par jour.

Résultats d’exemple

jour likes_count laughing cry exploding_head clap confetti_ball hugs chefs_kiss one_hundred plus_one rocket star_struck eyes discourse
2023-12-16 13 0 3 0 3 1 0 0 0 5 2 2 1 0
2023-12-17 17 1 0 2 2 0 0 0 0 4 4 1 2 0
2023-12-18 46 0 1 0 6 0 1 3 0 27 3 4 5 0
1 « J'aime »

Et attention pour nous, les non-développeurs… ces réactions sont codées en dur là et ce qui est utilisé ici. Cela signifie aussi que si les réactions proposées ont changé à un moment donné, cela montre de manière erronée les anciennes fois.

J’ai l’impression que cela compte mal si la valeur par défaut a changé de :heart: à :+1: par exemple.

@JammyDodger a corrigé une requête que j’utilisais et qui en tient compte, je crois :

2 « J'aime »