Skip to content

Catégoriser les user_activity : parcours LX / LG / LB, bibliothèque et kiosque

Comment savoir, pour une user_activity, si elle a été réalisée dans le cadre d'un parcours (LX, LG ou LB) ou bien depuis la bibliothèque / le kiosque (articles) ?

Il n'existe pas un critère unique : la règle dépend de l'app qui a créé l'UA, car les deux back-learner n'utilisent pas le même mécanisme de parcours.

Repo / Produit container.product_code Mécanisme « parcours » Signature du parcours en DB
learner-exam EXAM (LX) un planning (user_planning) user_planning_id IS NOT NULL
learner-general GENERAL (LG) / BUSINESS_ENGLISH (LB) une suite de mode_items mode_item_id IS NOT NULL

Le piège LX

En LX, un entraînement lancé depuis la bibliothèque est une activité STANDARD avec container_id et mode_item_id remplis — structurellement identique à une étape de parcours. Seul user_planning_id les distingue. C'est pourquoi mode_item_id ne peut servir de critère que pour LG / LB, et user_planning_id uniquement pour LX. À noter : mode_id est rempli dans tous les cas (parcours comme bibliothèque) — ce n'est jamais un discriminant.

La requête

{{date_min}} est un filtre de date optionnel au format Metabase : laissé vide, la ligne entière est ignorée ; renseigné, seules les UA démarrées à partir de cette date sont comptées.

Les filtres deleted_at IS NULL excluent les lignes soft-deleted. Sur container et activity ils sont placés dans le ON (et non le WHERE) pour préserver le LEFT JOIN et ne jamais faire disparaître une UA dont le container/activity a été supprimé.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT
    CASE
        -- 1) Parcours LX : seules les UA lancées depuis un planning LX remplissent user_planning_id
        WHEN ua.user_planning_id IS NOT NULL
            THEN 'parcours_LX'

        -- 2) Parcours LG / LB : pas de planning, mais étape structurée d'un mode (mode_item_id rempli).
        --    On exige le produit GENERAL / BUSINESS_ENGLISH car en EXAM un entraînement de
        --    bibliothèque possède AUSSI un mode_item_id (mais jamais de user_planning_id).
        WHEN c.product_code = 'GENERAL'          AND ua.mode_item_id IS NOT NULL THEN 'parcours_LG'
        WHEN c.product_code = 'BUSINESS_ENGLISH' AND ua.mode_item_id IS NOT NULL THEN 'parcours_LB'

        -- 3) Kiosque : les articles
        WHEN a.activity_type_code = 'ARTICLE' THEN 'kiosque'

        -- 4) Bibliothèque : tout le reste (entraînements LX hors planning, exercices,
        --    fiches de révision, examens blancs, évaluations de positionnement…)
        ELSE 'bibliotheque'
    END AS categorie,
    COUNT(*) AS nb
FROM user_activity ua
LEFT JOIN container c ON c.id = ua.container_id AND c.deleted_at IS NULL
JOIN activity a ON a.id = ua.activity_id AND a.deleted_at IS NULL
WHERE ua.deleted_at IS NULL
    -- Filtre de date optionnel (Metabase) : ne garde que les UA démarrées à partir de la date choisie
    [[AND ua.started_at >= {{date_min}}]]
GROUP BY categorie
ORDER BY nb DESC;

Variantes

  • Fusionner LG et LB : remplacer les deux branches par WHEN c.product_code IN ('GENERAL','BUSINESS_ENGLISH') AND ua.mode_item_id IS NOT NULL THEN 'parcours_LG_LB'.
  • Garder le kiosque dans la bibliothèque : supprimer la branche kiosque (les articles ont container_id IS NULL et activity_type_code = 'ARTICLE').
  • Inclure les UA supprimées : retirer les trois conditions deleted_at IS NULL (≈ 28,4 M d'UA sont soft-deleted, soit ~39 % du total).
  • Autre champ de date : remplacer ua.started_at par ua.ended_at ou ua.created_at.

Résultats (snapshot prod, UA non supprimées, sans filtre de date — 2026-06-03)

Catégorie Nombre d'UA
bibliotheque 20 261 689
parcours_LX 12 811 195
parcours_LG 7 953 371
parcours_LB 3 888 467
kiosque 187 568
TOTAL 45 102 290

Composition de la bibliothèque par activity_type_code : STANDARD ≈ 8,3 M (entraînements LX hors planning), PRACTICE_SKILL_STUDY_SHEET ≈ 5,3 M (fiches de révision), PRACTICE ≈ 4,2 M (exercices), CERTIFICATION + ADAPTIVE + ADAPTIVE_V2 ≈ 1,7 M (examens blancs LX), EVAL ≈ 0,8 M (tests de positionnement).

Keywords

select user_activity parcours bibliothèque kiosque planning mode_item product_code LX LG LB metabase