Aller au contenu
Apprendre.
  • M1 · toutes les matières15 matières : Préparation de données, API & sécurité, CI/CD, Docker, Merise, Dataviz, KNIME, ML appliqué : projet LoL, SQL & UML, SQL avancé, Machine Learning, Git, IA frugale & responsable, Qualité des données, MathématiquesAnnée
  • M2 · toutes les matières4 matières : Deep Learning, AI Act, Comex & Fundraising, Gouvernance & DataMeshAnnée
  • Deep LearningM2 · 4 modules · Réseaux de neurones, CNN, texte, modèles génératifs.Matière
  • Préparation de donnéesM1 · 3 modules · Nettoyer, transformer et fusionner des données avec Python.Matière
  • API & sécuritéM1 · 2 modules · Consommer, concevoir et sécuriser des API.Matière
  • CI/CDM1 · 1 module · Intégration et livraison continues.Matière
  • DockerM1 · 3 modules · Conteneurs, images, volumes, réseaux, Compose.Matière
  • MeriseM1 · 2 modules · Modéliser une base : MCD, MLD, MPD.Matière
  • DatavizM1 · 2 modules · Visualiser pour comprendre et décider.Matière
  • KNIMEM1 · 1 module · Explorer et nettoyer des données en workflow.Matière
  • ML appliqué : projet LoLM1 · 2 modules · Du besoin métier au POC de vision par ordinateur.Matière
  • SQL & UMLM1 · 3 modules · Modèles UML et requêtes SQL.Matière
  • SQL avancéM1 · 3 modules · Jointures, fenêtres, CTE, optimisation.Matière
  • Machine LearningM1 · 3 modules · Régression, classification, segmentation, projet.Matière

↑↓ naviguer↵ ouvre le résultat en surbrillanceesc fermer

Partie 2 · Syntaxe

OVER, PARTITION BY et ORDER BY

Une window function calcule une quantité sur chaque ligne en utilisant la ligne courante, d'autres lignes du même groupe, éventuellement un ordre et éventuellement une fenêtre explicite. Forme générale : fonction(...) OVER (...). La clause OVER définit le contexte : groupe de travail, ordre interne, fenêtre active.

SQL classiqueSQL analytique
f(ligne)f(ligne, voisinage)
dépend du contenu de la ligne courantedépend d'un contexte défini dans OVER(...)

Le SQL analytique ajoute une notion de mémoire et de structure aux tables. Dans fonction(...) OVER (PARTITION BY ... ORDER BY ... ROWS BETWEEN ...) :

  • PARTITION BY sépare les données en sous-ensembles indépendants ;
  • ORDER BY impose un ordre à l'intérieur de chaque sous-ensemble ;
  • ROWS/RANGE précise la fenêtre exacte utilisée autour de la ligne courante.

Vérifie que tu as compris

Dans fonction(...) OVER (PARTITION BY ... ORDER BY ... ROWS BETWEEN ...), quel élément précise la fenêtre exacte autour de la ligne courante ?

Exemple central : le rendement journalier

On veut ret_t = close_t − close_(t−1). L'idée naturelle :

close - LAG(close) OVER (
    PARTITION BY ticker
    ORDER BY date
)

PARTITION BY ticker : calcul séparé pour chaque actif. ORDER BY date : définit ce que veut dire « précédent ». LAG(close) : récupère la valeur passée.

datecloseLAG(close)ret
2024-01-01100NULLNULL
2024-01-021021002
2024-01-03101102−1
2024-01-041051014

Lire une expression analytique

Une requête analytique se lit comme une procédure logique de construction du contexte :

  1. on prend la table ;
  2. on la découpe par ticker ;
  3. dans chaque sous-table, on ordonne par date ;
  4. sur chaque ligne, on lit la valeur de close de la ligne précédente.

Vérifie que tu as compris

Sur la 3e ligne de la table ci-dessus (close = 101), que vaut close - LAG(close) OVER (PARTITION BY ticker ORDER BY date) ?

Pourquoi PARTITION BY, pourquoi ORDER BY ?

Si la table contient deux actifs A et B, sans PARTITION BY la ligne précédente d'une ligne de B pourrait être une ligne de A, ce qui n'a aucun sens financier : oublier PARTITION BY revient à mélanger des univers qui ne doivent pas l'être. Il ne sert pas « à faire joli », il définit les frontières du calcul.

Et LAG n'a de sens que si l'on sait ce que signifie « la ligne précédente ». Une table SQL n'est pas une liste ordonnée par nature : sans ORDER BY il n'y a pas de chronologie définie, le moteur n'a aucune notion de premier ou deuxième élément, le résultat peut être non déterministe ou sémantiquement faux.

Pour qu'une window function soit bien définie, réponds à trois questions : sur quel groupe calcule-t-on ? dans quel ordre lit-on les lignes ? sur quelle portion du groupe porte le calcul ?

À toi de coder

Corriger le rendement : PARTITION BY ticker

Voici la requête de l'« erreur guidée » du TP : close - LAG(close) OVER (ORDER BY date). Elle est syntaxiquement correcte mais analytiquement fausse : sans PARTITION BY, la « ligne précédente » d'un actif peut être une ligne d'un autre actif.

Complète la fenêtre pour que le rendement soit calculé séparément par actif, dans l'ordre chronologique. Le résultat doit être trié par ticker, date (colonnes : date, ticker, close, ret) ; la première ligne de chaque actif doit valoir NULL.

Ctrl/⌘+Entrée

Vérifie que tu as compris

Que se passe-t-il si on oublie PARTITION BY ticker dans un LAG sur une table contenant plusieurs actifs ?