Domande risolte e argomenti attualmente assegnati per utente al mese

:discourse: Questo report richiede che il plugin Discourse Solved sia abilitato.

Questo report di Data Explorer fornisce una panoramica delle attività svolte dai membri di un gruppo specifico in un dato intervallo di tempo. In particolare, si concentra su due attività principali: domande risolte e argomenti assegnati.
Il report è progettato per aiutare gli amministratori a comprendere i contributi e il carico di lavoro dei membri del gruppo, facilitando una migliore allocazione delle risorse e il riconoscimento dei contributori attivi.

--[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, dst.created_at) AS month,
        COUNT(*) AS total_solved
    FROM discourse_solved_solved_topics dst
    JOIN posts p ON p.id = dst.answer_post_id
    JOIN group_users_filtered guf ON guf.user_id = p.user_id
    WHERE dst.created_at BETWEEN :start_date AND :end_date
    GROUP BY p.user_id, DATE_TRUNC(:date_trunc, dst.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

Spiegazione della Query SQL

Il report viene generato attraverso una serie di Common Table Expressions (CTE) che filtrano e aggregano i dati in base ai parametri specificati. Ecco una ripartizione di ciascuna CTE e del suo ruolo nel report:

CTE Spiegate

  1. group_users_filtered: Questa CTE identifica gli utenti che sono membri del gruppo specificato (:group_name_filter). Filtra gli utenti in base alla loro appartenenza al gruppo di interesse.
  2. user_groups: Questa CTE aggrega tutti i gruppi a cui un utente appartiene in un’unica stringa. Questo aiuta a identificare tutti i gruppi associati a un utente, fornendo contesto alle loro attività.
  3. questions_solved: Questa CTE calcola il numero totale di domande risolte da ciascun utente nell’intervallo di date specificato (:start_date a :end_date).
  4. assigns_per_user: Simile a questions_solved, questa CTE conta il numero di attività assegnate a ciascun utente nell’intervallo di date specificato. Assicura che vengano conteggiati solo gli incarichi agli utenti (non ai gruppi o ad altre entità) ed esclude gli argomenti eliminati.

La query finale combina queste CTE per produrre un report che include la data (o l’intervallo di date), l’ID utente, il totale delle domande risolte, il totale degli argomenti assegnati e i nomi dei gruppi a cui l’utente appartiene. Consente il filtraggio per un elenco specifico di utenti, se fornito (:user_list), e può regolare la granularità della data in base al parametro :date_trunc (ad esempio, mese, anno).

Parametri

  • group_name_filter (stringa): Il nome del gruppo per filtrare gli utenti, impostato su “staff” per impostazione predefinita. Questo parametro viene utilizzato per selezionare gli utenti che sono membri di un gruppo specifico.
  • date_trunc (stringa): Determina la granularità dell’aggregazione temporale per il reporting (ad esempio, “mese”, “anno”, “settimana”, “giorno”). Questo influisce su come i dati vengono raggruppati per tempo nell’output.
  • user_list (null user_list): Un elenco facoltativo di ID utente per filtrare ulteriormente i risultati. Se fornito, la query includerà solo i dati per questi utenti.
  • userlist_filter (booleano): Un flag per indicare se il filtro user_list deve essere applicato. Se impostato su false, il parametro user_list viene ignorato e vengono inclusi i dati per tutti gli utenti nel gruppo specificato.
  • start_date (data): La data di inizio del periodo per cui segnalare le attività.
  • end_date (data): La data di fine del periodo per cui segnalare le attività.

Risultati

Il report fornisce le seguenti colonne:

  • date: La data o l’inizio dell’intervallo di date per cui i dati sono aggregati.
  • date_range: La granularità dell’intervallo di date (ad esempio, mese, anno).
  • user_id: L’ID dell’utente.
  • total_solved_questions: Il numero totale di domande risolte dall’utente.
  • total_assigned_topics: Il numero totale di attività assegnate all’utente.
  • group_names: Una stringa contenente i nomi di tutti i gruppi a cui appartiene l’utente.

:person_tipping_hand: Si noti che a causa del modo in cui funziona la tabella assignments in Discourse, questo report sarà in grado di monitorare solo gli argomenti attualmente assegnati e mostrerà gli argomenti attualmente assegnati alla data in cui sono stati assegnati (o riassegnati).

Risultati di esempio

date date_range user total_solved_questions total_assigned_topics group_names
2023-12-01 month user1 5 3 admins, customer-projects-team, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, trust_level_2
2023-11-01 month user2 8 1 admins, moderators, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, support, trust_level_2
2023-11-01 month user3 3 4 admins, moderators, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, trust_level_2
3 Mi Piace

Non poteva essere più tempestivo! Stavo giusto avendo bisogno di fare qualcosa del genere e VOILA! è apparso! :tada:

Grazie!

È un peccato che non possiamo ottenere statistiche sui compiti passati (per argomenti chiusi). Non si può avere tutto, immagino.

1 Mi Piace