prof404
← Retour aux ressources du module
Sommaire (3 sections) · 3 min
Ce que tu travailles iciAnalyser et synthétiserPourquoi ces compétences ?
  • BC02Analyser et synthétiser. Faire parler la donnée : calculer ce qui décrit vraiment une population, repérer une tendance, et dire ce qu'elle veut dire pour l'entreprise.

Ce sont les compétences du titre RNCP 38616, celles sur lesquelles le jury évalue.

Comparer des périodes quand une période manque

Tu comptes les avis notés 2 par mois. Le résultat passe d'octobre 2016 à janvier 2017. Pourtant, LAG appelle octobre « ligne précédente » de janvier.

Cette fiche travaille l'interprétation de tendances en BC02. Elle utilise Olist pour apprendre le contrôle, puis te demande de le transférer sur un autre jeu.

Observer le trou

SQL
WITH par_mois AS (
    SELECT date_trunc('month', o.order_purchase_timestamp)::date AS mois,
           COUNT(*) AS avis_note_2
    FROM order_reviews r
    JOIN orders o ON o.order_id = r.order_id
    WHERE r.review_score = 2
    GROUP BY 1
),
avec_precedent AS (
    SELECT mois, avis_note_2,
           LAG(mois) OVER (ORDER BY mois) AS precedent
    FROM par_mois
)
SELECT mois, avis_note_2, precedent
FROM avec_precedent
WHERE precedent IS NULL
   OR mois <> (precedent + interval '1 month')::date
ORDER BY mois;

Avant d'exécuter, prédis ce que la seconde ligne signalera. Le résultat est :

mois avis_note_2 precedent
2016-10-01 8
2017-01-01 27 2016-10-01

Novembre et décembre n'ont aucune ligne dans le résultat agrégé. LAG est une fonction de fenêtrage : elle lit la ligne précédente dans l'ordre fourni, pas le mois précédent du calendrier.

Fabriquer les mois attendus

generate_series produit le calendrier. LEFT JOIN garde ses mois même sans observation et COALESCE transforme l'absence de compte en zéro.

SQL
WITH par_mois AS (
    SELECT date_trunc('month', o.order_purchase_timestamp)::date AS mois,
           COUNT(*) AS avis_note_2
    FROM order_reviews r
    JOIN orders o ON o.order_id = r.order_id
    WHERE r.review_score = 2
    GROUP BY 1
),
calendrier AS (
    SELECT generate_series(MIN(mois), MAX(mois), interval '1 month')::date AS mois
    FROM par_mois
),
complet AS (
    SELECT c.mois, COALESCE(p.avis_note_2, 0) AS avis_note_2
    FROM calendrier c
    LEFT JOIN par_mois p USING (mois)
)
SELECT mois, avis_note_2,
       LAG(avis_note_2) OVER (ORDER BY mois) AS mois_precedent
FROM complet
ORDER BY mois
LIMIT 6;

Les quatre premières lignes deviennent :

mois avis_note_2 mois_precedent
2016-10-01 8
2016-11-01 0 8
2016-12-01 0 0
2017-01-01 27 0

Prédis maintenant ce qui arriverait à un pourcentage d'évolution en janvier : le dénominateur serait zéro. Une comparaison exacte dans le calendrier n'est pas forcément calculable ni interprétable. Garde NULL quand la base de comparaison vaut zéro et explique cette absence.

Modifier puis transférer

Remplace la note 2 par une autre note. Avant d'exécuter, prédis si les mêmes mois manqueront. Vérifie avec la première requête, puis complète le calendrier seulement si la question demande tous les mois.

Sur un autre jeu de données, produis ensuite une série quotidienne ou hebdomadaire. Rends les lignes qui prouvent le trou, puis les mêmes lignes après complétion. Le schémaLa description des tables d'une base : leurs noms, leurs colonnes, et le type de chaque colonne. de transfert doit être nouveau pour toi : ne recopie pas les noms Olist de cette fiche.

La série des avis notés 2 passe d'octobre 2016 à janvier 2017. Que lit LAG(valeur) sur janvier avant de compléter le calendrier ?