Partie 1 · Contexte
Pourquoi SQL avancé ?
SQL n'est pas seulement un langage d'interrogation, ni un outil pour filtrer des lignes : il permet de définir des transformations analytiques sur des données structurées. L'enjeu d'un SQL avancé n'est pas d'écrire des requêtes plus longues, mais de comprendre comment une table devient un objet calculable.
Le cours a un fil rouge : une table de prix financiers prices(date, ticker, close). Chaque ligne contient une date, un actif et un prix de clôture. Nous allons calculer des rendements, des moyennes glissantes, des signaux, des classements, une performance cumulée et un pipeline complet.
| date | ticker | close |
|---|---|---|
| 2024-01-01 | A | 100 |
| 2024-01-02 | A | 102 |
| 2024-01-01 | B | 50 |
| 2024-01-02 | B | 49 |
(Les petites valeurs A et B de ce site sont un exemple ajouté ; le cours utilise des données de marché réelles.)
La question de départ
Peut-on calculer en SQL le rendement simple ret_t = close_t − close_(t−1) ? La question est simple en apparence, mais elle force à réfléchir à trois idées : qu'est-ce qu'une ligne ? comment définir la ligne précédente ? sur quel groupe de lignes travaille-t-on ?
Le SQL relationnel élémentaire raisonne comme si les lignes étaient indépendantes, interchangeables et non ordonnées. Or ici : le rendement du jour dépend du prix d'hier, la moyenne glissante dépend d'un voisinage temporel, le classement d'un actif dépend des autres actifs à la même date. Dès qu'une ligne dépend d'autres lignes, le SQL basique ne suffit plus.
Vérifie que tu as compris
SELECT ... WHERE close > 100 traite chaque ligne isolément. Laquelle de ces quantités ne peut PAS s'écrire ainsi ?Une rupture conceptuelle
Une ligne n'est plus traitée isolément : elle doit être interprétée dans son contexte (son passé, son futur, son voisinage local, son groupe d'appartenance, l'ensemble des lignes comparables). Dans une table ordonnée, une quantité calculée sur la ligne i s'écrit u_i ↦ f(u_(i−k), …, u_i, …, u_(i+ℓ)) : la valeur produite dépend d'un voisinage de la ligne.
| Forme | Type de dépendance |
|---|---|
u_i − u_(i−1) | ponctuelle vers le passé |
moyenne de u_(i−4) à u_i | locale glissante |
somme des u_j pour j ≤ i | cumulative |
Les window functions permettent précisément d'exprimer ces dépendances en SQL.
Vérifie que tu as compris
La méthode générale
Face à une question analytique, pose-toi toujours ces quatre questions :
- Quelle est l'unité de calcul ? Une ligne ? Une date ? Un actif ? Un couple (date, actif) ?
- De quelles lignes dépend cette ligne ?
- Faut-il séparer les calculs par groupe ? ⇒
PARTITION BY - Faut-il imposer un ordre ? ⇒
ORDER BY
Dans le TP, l'unité de calcul de prices est un couple (date, actif) auquel on associe un prix de clôture. Et avant tout calcul, on valide le support : nombre de lignes, observations par actif, première et dernière date (COUNT(*), GROUP BY, MIN(date), MAX(date)). Une requête peut être correcte syntaxiquement et fausse analytiquement.
À toi de coder
Vérifie que tu as compris