← Tous les exercices
Top 2 des actifs à chaque date
Partie 2 · ★★
Classement cross-sectionnel : à chaque date on classe les actifs du plus grand prix au plus petit. On ne peut pas filtrer directement sur le résultat d'une window function dans le WHERE de la même requête : on la place dans une sous-requête.
Renvoie date, ticker, rang pour les 2 meilleurs actifs de chaque date, trié par date, rang.
import sqlite3 con = sqlite3.connect(":memory:") con.execute("CREATE TABLE prices(date TEXT, ticker TEXT, close REAL)") A = [100, 102, 101, 105, 107, 108] B = [50, 49, 51, 50, 52, 55] C = [80, 90, 83, 110, 79, 120] for i in range(6): d = f"2024-01-0{i + 1}" for t, s in (("A", A), ("B", B), ("C", C)): con.execute("INSERT INTO prices VALUES (?, ?, ?)", (d, t, s[i])) sql = """ SELECT date, ticker, rang FROM ( SELECT date, ticker, ROW_NUMBER() OVER (PARTITION BY ___ ORDER BY close ___) AS rang FROM prices ) t WHERE rang <= 2 ORDER BY date, rang """ rows = con.execute(sql).fetchall()
Ctrl/⌘+Entrée