@SaraDev
você pode fornecer a consulta SQL para as métricas disponíveis em https://meta.discourse.org/u?cards=no&order=post_count
consulte a imagem abaixo
métricas
curtidas recebidas
curtidas dadas
tópicos visualizados
posts lidos
dias visitados
soluções
saudações
estamos utilizando moderadores de categoria, portanto, estamos modificando a consulta de moderador para qualquer grupo determinado
As estatísticas da página de usuário /u podem ser recuperadas através do Explorador de Dados usando a tabela directory_items.
Métricas da Página do Diretório de Usuários
-- [params]
-- int :period
-- Opções de Período:
-- 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
Em vez dos parâmetros típicos start_date e end_date, os dados desta tabela podem ser filtrados usando o campo period_type, onde os seguintes valores correspondem aos diferentes períodos de tempo disponíveis na página do diretório:
Se você quiser visualizar essas métricas para usuários em seu site e filtrar por datas de início e fim específicas, você precisaria de uma consulta que extraia os dados para cada métrica em uma CTE separada e, em seguida, combine os resultados em uma instrução SELECT final.
É assim que ficaria:
Métricas do Usuário
-- [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
Explicação da Consulta:
Parâmetros:
:start_date e :end_date são parâmetros que definem o intervalo de datas para os dados que estão sendo consultados.
Expressões de Tabela Comuns (CTEs):
likes_received: Conta o número de curtidas recebidas por cada usuário (action_type = 2) dentro do intervalo de datas especificado.
likes_given: Conta o número de curtidas dadas por cada usuário (action_type = 1) dentro do intervalo de datas especificado.
user_metrics: Agrega estatísticas de usuário, como tópicos visualizados, posts lidos e dias visitados, para usuários que fizeram seu primeiro post dentro do intervalo de datas especificado.
solutions: Conta o número de soluções fornecidas por cada usuário (action_type = 15) dentro do intervalo de datas especificado.
cheers: Soma as pontuações de gamificação para cada usuário dentro do intervalo de datas especificado.
Seleção Final:
A consulta principal seleciona as métricas de engajamento do usuário para cada usuário, incluindo curtidas recebidas, curtidas dadas, tópicos visualizados, posts lidos, dias visitados, soluções fornecidas e aplausos recebidos.
Ela usa LEFT JOIN para garantir que todos os usuários sejam incluídos, mesmo que não tenham atividade em algumas categorias, preenchendo com zeros usando COALESCE.
Usamos a consulta fornecida na postagem acima e temos as seguintes perguntas:
user_metrics da tabela user_stats é a fonte correta para esta informação? Dado que user_stats é uma tabela estática que resume as métricas de um usuário desde que ele ingressou no Discourse, pode não ser ideal para filtrar métricas dentro de um período específico (por exemplo, de uma data de início a uma data de término).
Comparação de Séries Temporais (T/S C/O)
Para um determinado conjunto de usuários, comparamos os dados do período de tempo disponíveis na página do usuário e notamos discrepâncias significativas.
Principais Discrepâncias:
topics_entered
posts_read_count
days_visited
Você poderia esclarecer se há uma maneira melhor de recuperar métricas de usuário limitadas no tempo?
Você está correto que a tabela user_stats é uma tabela estática que resume as métricas de vida de um usuário desde que ele ingressou no Discourse.
Em vez disso, para filtrar métricas por data, como posts_read_count e days_visited, usaríamos a tabela de banco de dados user_visits para posts. Também usaríamos a tabela topic_views para filtrar as métricas topics_entered por data.
As discrepâncias que você observou surgem do uso da tabela user_stats em vez de outras tabelas como user_visits e topic_views para filtrar essas estatísticas por data.
Para resolver isso, podemos atualizar a consulta para usar essas tabelas de banco de dados em vez disso:
Aqui está uma versão atualizada da consulta:
Métricas da Página do Usuário
-- [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
Note que com este método, os dados de posts_read na tabela user_visits têm uma distinção importante: não contam os posts do próprio usuário, enquanto os dados da tabela user_stats incluem posts de autoria própria, então você ainda pode encontrar uma diferença entre essas duas estatísticas nesta consulta e na Página do Usuário.