@SaraDev
Kannst du die SQL-Abfrage für die Metriken bereitstellen, die unter https://meta.discourse.org/u?cards=no&order=post_count verfügbar sind?
Siehe Bild unten
Metriken
Likes erhalten
Likes vergeben
Angesehene Themen
Gelesene Beiträge
Besuchte Tage
Lösungen
Prost
Wir nutzen Kategorie-Moderatoren, daher modifizieren wir die Moderator-Abfrage für jede gegebene Gruppe.
Die Statistiken der /u-Benutzerseite können über den Data Explorer mit der Tabelle directory_items abgerufen werden.
Benutzerverzeichnis-Seitenmetriken
-- [params]
-- int :period
-- Periodenoptionen:
-- 1. all
-- 2. yearly
-- 3. monthly
-- 4. weekly
-- 5. daily
-- 6. quarterly
SELECT
di.user_id,
COALESCE(di.likes_received, 0) AS likes_received,
COALESCE(di.likes_given, 0) AS likes_given,
COALESCE(di.topics_entered, 0) AS topics_viewed,
COALESCE(di.topic_count, 0) AS topic_count,
COALESCE(di.post_count, 0) AS post_count,
COALESCE(di.days_visited, 0) AS days_visited,
COALESCE(di.posts_read, 0) AS posts_read,
COALESCE(di.solutions, 0) AS solutions,
COALESCE(di.gamification_score, 0) AS cheers
FROM
directory_items di
WHERE
di.period_type = :period
ORDER BY
di.user_id
Anstelle der üblichen Parameter start_date und end_date können Daten aus dieser Tabelle mithilfe des Feldes period_type gefiltert werden, wobei die folgenden Werte den verschiedenen Zeiträumen entsprechen, die auf der Verzeichnisseite verfügbar sind:
1: gesamte Zeit
2: jährlich
3: monatlich
4: wöchentlich
5: täglich
6: vierteljährlich
Beispielergebnisse für diesen Bericht würden wie folgt aussehen:
Wenn Sie diese Metriken für Benutzer auf Ihrer Website anzeigen und nach bestimmten Start- und Enddaten filtern möchten, benötigen Sie eine Abfrage, die die Daten für jede Metrik in einem separaten CTE abruft und dann die Ergebnisse in einer endgültigen SELECT-Anweisung kombiniert.
So würde das aussehen:
Benutzerstatistiken
-- [params]
-- date :start_date = 2020-01-01
-- date :end_date = 2025-01-01
WITH likes_received AS (
SELECT
ua.user_id AS user_id,
COUNT(*) AS likes_received
FROM
user_actions ua
WHERE
ua.action_type = 2
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.user_id
),
likes_given AS (
SELECT
ua.acting_user_id AS user_id,
COUNT(*) AS likes_given
FROM
user_actions ua
WHERE
ua.action_type = 1
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.acting_user_id
),
user_metrics AS (
SELECT
us.user_id,
SUM(us.topics_entered) AS topics_viewed,
SUM(us.posts_read_count) AS posts_read,
SUM(us.days_visited) AS days_visited
FROM
user_stats us
WHERE
us.first_post_created_at BETWEEN :start_date AND :end_date
GROUP BY
us.user_id
),
solutions AS (
SELECT
ua.acting_user_id AS user_id,
COUNT(*) AS solutions
FROM
user_actions ua
WHERE
ua.action_type = 15
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.acting_user_id
),
cheers AS (
SELECT
gs.user_id,
SUM(gs.score) AS cheers
FROM
gamification_scores gs
WHERE
gs.date BETWEEN :start_date AND :end_date
GROUP BY
gs.user_id
)
SELECT
u.id AS user_id,
COALESCE(lr.likes_received, 0) AS likes_received,
COALESCE(lg.likes_given, 0) AS likes_given,
COALESCE(um.topics_viewed, 0) AS topics_viewed,
COALESCE(um.posts_read, 0) AS posts_read,
COALESCE(um.days_visited, 0) AS days_visited,
COALESCE(sol.solutions, 0) AS solutions,
COALESCE(ch.cheers, 0) AS cheers
FROM
users u
LEFT JOIN
likes_received lr ON u.id = lr.user_id
LEFT JOIN
likes_given lg ON u.id = lg.user_id
LEFT JOIN
user_metrics um ON u.id = um.user_id
LEFT JOIN
solutions sol ON u.id = sol.user_id
LEFT JOIN
cheers ch ON u.id = ch.user_id
ORDER BY
u.id
Erklärung der Abfrage:
Parameter:
:start_date und :end_date sind Parameter, die den Datumsbereich für die abgefragten Daten definieren.
Common Table Expressions (CTEs):
likes_received: Zählt die Anzahl der von jedem Benutzer erhaltenen Likes (action_type = 2) im angegebenen Datumsbereich.
likes_given: Zählt die Anzahl der von jedem Benutzer vergebenen Likes (action_type = 1) im angegebenen Datumsbereich.
user_metrics: Aggregiert Benutzerstatistiken wie angesehene Themen, gelesene Beiträge und besuchte Tage für Benutzer, die ihren ersten Beitrag im angegebenen Datumsbereich erstellt haben.
solutions: Zählt die Anzahl der von jedem Benutzer bereitgestellten Lösungen (action_type = 15) im angegebenen Datumsbereich.
cheers: Summiert die Gamification-Scores für jeden Benutzer im angegebenen Datumsbereich.
Finale Auswahl:
Die Hauptabfrage wählt die Benutzerinteraktionsmetriken für jeden Benutzer aus, einschließlich erhaltener Likes, gegebener Likes, angesehene Themen, gelesene Beiträge, besuchte Tage, bereitgestellte Lösungen und erhaltene Cheers.
Sie verwendet LEFT JOIN, um sicherzustellen, dass alle Benutzer enthalten sind, auch wenn sie in einigen Kategorien keine Aktivität haben, und füllt fehlende Werte mit Nullen mithilfe von COALESCE.
Wir haben die im obigen Beitrag bereitgestellte Abfrage verwendet und haben die folgenden Fragen:
Ist user_metrics aus der Tabelle user_stats die richtige Quelle für diese Informationen? Da user_stats eine statische Tabelle ist, die die Metriken eines Benutzers seit seinem Beitritt zu Discourse zusammenfasst, ist sie möglicherweise nicht ideal für die Filterung von Metriken innerhalb eines bestimmten Zeitraums (z. B. von einem Startdatum bis zu einem Enddatum).
Zeitreihenvergleich (T/S V/G)
Für eine gegebene Gruppe von Benutzern haben wir die verfügbaren Zeitraumbereiche auf der Benutzerseite verglichen und erhebliche Abweichungen festgestellt.
Wesentliche Abweichungen:
topics_entered
posts_read_count
days_visited
Könnten Sie bitte klären, ob es eine bessere Möglichkeit gibt, zeitgebundene Benutzerstatistiken abzurufen?
Sie haben Recht, dass die Tabelle user_stats eine statische Tabelle ist, die die lebenslangen Metriken eines Benutzers seit seinem Beitritt zu Discourse zusammenfasst.
Stattdessen würden wir für die Filterung von Metriken nach Datum wie posts_read_count und days_visited die Datenbanktabelle user_visits für posts verwenden. Wir würden auch die Tabelle topic_views verwenden, um die Metriken topics_entered nach Datum zu filtern.
Die von Ihnen beobachteten Diskrepanzen ergeben sich aus der Verwendung der Tabelle user_stats anstelle anderer Tabellen wie user_visits und topic_views zum Filtern dieser Statistiken nach Datum.
Um dies zu beheben, können wir die Abfrage aktualisieren, um stattdessen diese Datenbanktabellen zu verwenden:
Hier ist eine aktualisierte Version der Abfrage:
Benutzerseitige Metriken
-- [params]
-- date :start_date = 2020-01-01
-- date :end_date = 2026-01-01
WITH likes_received AS (
SELECT
ua.user_id AS user_id,
COUNT(*) AS likes_received
FROM
user_actions ua
WHERE
ua.action_type = 2
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.user_id
),
likes_given AS (
SELECT
ua.acting_user_id AS user_id,
COUNT(*) AS likes_given
FROM
user_actions ua
WHERE
ua.action_type = 1
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.acting_user_id
),
user_metrics AS (
SELECT
tv.user_id,
COUNT(DISTINCT tv.topic_id) AS topics_viewed
FROM
topic_views tv
WHERE
tv.viewed_at BETWEEN :start_date AND :end_date
GROUP BY
tv.user_id
),
days_and_posts AS (
SELECT
uv.user_id,
COUNT(DISTINCT uv.visited_at) AS days_visited,
SUM(uv.posts_read) AS posts_read
FROM
user_visits uv
WHERE
uv.visited_at BETWEEN :start_date AND :end_date
GROUP BY
uv.user_id
),
solutions AS (
SELECT
ua.acting_user_id AS user_id,
COUNT(*) AS solutions
FROM
user_actions ua
WHERE
ua.action_type = 15
AND ua.created_at BETWEEN :start_date AND :end_date
GROUP BY
ua.acting_user_id
),
cheers AS (
SELECT
gs.user_id,
SUM(gs.score) AS cheers
FROM
gamification_scores gs
WHERE
gs.date BETWEEN :start_date AND :end_date
GROUP BY
gs.user_id
)
SELECT
u.id AS user_id,
COALESCE(lr.likes_received, 0) AS likes_received,
COALESCE(lg.likes_given, 0) AS likes_given,
COALESCE(um.topics_viewed, 0) AS topics_viewed,
COALESCE(dp.days_visited, 0) AS days_visited,
COALESCE(dp.posts_read, 0) AS posts_read,
COALESCE(sol.solutions, 0) AS solutions,
COALESCE(ch.cheers, 0) AS cheers
FROM
users u
LEFT JOIN
likes_received lr ON u.id = lr.user_id
LEFT JOIN
likes_given lg ON u.id = lg.user_id
LEFT JOIN
user_metrics um ON u.id = um.user_id
LEFT JOIN
days_and_posts dp ON u.id = dp.user_id
LEFT JOIN
solutions sol ON u.id = sol.user_id
LEFT JOIN
cheers ch ON u.id = ch.user_id
ORDER BY
u.id
Beachten Sie, dass bei dieser Methode die Daten posts_read in der Tabelle user_visits eine wichtige Unterscheidung aufweisen – sie zählen keine eigenen Beiträge eines Benutzers, während die Daten aus der Tabelle user_stats selbst verfasste Beiträge enthalten. Daher können Sie zwischen diesen beiden Statistiken in dieser Abfrage und auf der Benutzerseite immer noch einen Unterschied feststellen.