Este relatório requer que o plugin Discourse Solved esteja ativado.
Este relatório do Data Explorer oferece uma visão geral das atividades realizadas pelos membros de um grupo específico dentro de um determinado período. Especificamente, ele se concentra em duas atividades principais: perguntas resolvidas e tópicos atribuídos.
O relatório foi projetado para ajudar os administradores a entender as contribuições e a carga de trabalho dos membros do grupo, facilitando uma melhor alocação de recursos e o reconhecimento de contribuidores ativos.
--[params]
-- string :group_name_filter = staff
-- string :date_trunc = month
-- null user_list :user_list
-- boolean :userlist_filter = false
-- date :start_date = 2023-01-01
-- date :end_date = 2024-01-01
WITH group_users_filtered AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g ON g.id = gu.group_id
WHERE g.name = :group_name_filter
),
user_groups AS (
SELECT
gu.user_id,
STRING_AGG(g.name, ', ') AS group_names
FROM group_users gu
JOIN groups g ON g.id = gu.group_id
GROUP BY gu.user_id
),
questions_solved AS (
SELECT
p.user_id,
DATE_TRUNC(:date_trunc, dsta.created_at) AS month,
COUNT(*) AS total_solved
FROM discourse_solved_solved_topics dsst
JOIN discourse_solved_topic_answer dsta on dsta.solved_id = dsst.id
JOIN posts p ON p.id = dsta.answer_post_id
JOIN group_users_filtered guf ON guf.user_id = p.user_id
WHERE dsta.created_at BETWEEN :start_date AND :end_date
GROUP BY p.user_id, DATE_TRUNC(:date_trunc, dsta.created_at)
),
assigns_per_user AS (
SELECT
a.assigned_to_id AS user_id,
DATE_TRUNC(:date_trunc, a.created_at) AS month,
COUNT(a.topic_id) AS total_assigned
FROM assignments a
JOIN topics t ON t.id = a.topic_id
JOIN group_users_filtered guf ON guf.user_id = a.assigned_to_id
WHERE a.assigned_to_type = 'User'
AND t.deleted_at IS NULL
AND a.created_at BETWEEN :start_date AND :end_date
GROUP BY a.assigned_to_id, DATE_TRUNC(:date_trunc, a.created_at)
)
SELECT
COALESCE(qs.month, apu.month)::DATE AS date,
:date_trunc as date_range,
COALESCE(qs.user_id, apu.user_id, ug.user_id) AS user_id,
COALESCE(qs.total_solved, 0) AS total_solved_questions,
COALESCE(apu.total_assigned, 0) AS total_assigned_topics,
COALESCE(ug.group_names, '') AS group_names
FROM questions_solved qs
FULL OUTER JOIN assigns_per_user apu ON qs.user_id = apu.user_id AND qs.month = apu.month
LEFT JOIN user_groups ug ON ug.user_id = COALESCE(qs.user_id, apu.user_id)
WHERE (qs.user_id IN(:user_list) OR :userlist_filter = FALSE)
ORDER BY date DESC
Explicação da Consulta SQL
O relatório é gerado por meio de uma série de Expressões de Tabela Comum (CTEs) que filtram e agregam dados com base nos parâmetros especificados. Aqui está uma descrição de cada CTE e seu papel no relatório:
CTEs Explicadas
- group_users_filtered: Esta CTE identifica os usuários que são membros do grupo especificado (
:group_name_filter). Ela filtra os usuários com base na sua membresia no grupo de interesse. - user_groups: Esta CTE agrega todos os grupos aos quais um usuário pertence em uma única string. Isso ajuda a identificar todos os grupos associados a um usuário, fornecendo contexto para suas atividades.
- questions_solved: Esta CTE calcula o número total de perguntas resolvidas por cada usuário dentro do intervalo de datas especificado (
:start_datea:end_date). - assigns_per_user: Similar a
questions_solved, esta CTE conta o número de tarefas atribuídas a cada usuário no intervalo de datas especificado. Ela garante que apenas atribuições a usuários (não grupos ou outras entidades) sejam contadas e exclui tópicos excluídos.
A consulta final combina essas CTEs para produzir um relatório que inclui a data (ou intervalo de datas), o ID do usuário, o total de perguntas resolvidas, o total de tópicos atribuídos e os nomes dos grupos aos quais o usuário pertence. Permite filtrar por uma lista específica de usuários, se fornecida (:user_list), e pode ajustar a granularidade das datas com base no parâmetro :date_trunc (por exemplo, mês, ano).
Parâmetros
group_name_filter(string): O nome do grupo para filtrar os usuários, definido como „staff