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
- 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. - 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à.
- questions_solved: Questa CTE calcola il numero totale di domande risolte da ciascun utente nell’intervallo di date specificato (
:start_datea:end_date). - 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 filtrouser_listdeve essere applicato. Se impostato sufalse, il parametrouser_listviene 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.
Si noti che a causa del modo in cui funziona la tabella
assignmentsin 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 |
| … | … | … | … | … | … |