← Tous les exercices
GROUP BY réduit, OVER conserve
Partie 1 · ★
Même moyenne, deux effets opposés. Avec GROUP BY on obtient une ligne par actif ; avec AVG(...) OVER (PARTITION BY ...) on garde toutes les lignes en ajoutant la moyenne de l'actif à chacune.
La table prices contient maintenant trois actifs A, B, C sur 6 jours. Complète sql_group (ticker, AVG(close), trié par ticker) et sql_over (ticker, date, close, moy, trié par ticker, date).
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_group = """ SELECT ticker, AVG(close) FROM prices GROUP BY ___ ORDER BY ticker """ sql_over = """ SELECT ticker, date, close, AVG(close) OVER (PARTITION BY ___) AS moy FROM prices ORDER BY ticker, date """ rows_group = con.execute(sql_group).fetchall() rows_over = con.execute(sql_over).fetchall()
Ctrl/⌘+Entrée