Questões resolvidas e tópicos atribuídos atualmente por usuário por mês

:discourse: 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

  1. 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.
  2. 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.
  3. questions_solved: Esta CTE calcula o número total de perguntas resolvidas por cada usuário dentro do intervalo de datas especificado (:start_date a :end_date).
  4. 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

Isso não poderia ter vindo em melhor hora! Eu estava precisando fazer algo assim e VOILÀ! apareceu! :tada:

Obrigado!

É uma pena que não possamos obter estatísticas sobre tarefas passadas (para tópicos fechados). Não se pode ter tudo, eu acho.