04 Agrégats en temps réel
Lisez l'OHLC du point médian des cotations à la minute maintenu par une vue matérialisée incrémentale.
Point de départ
Le collecteur est sain et polymarket.price_ticks contient des lignes.
Pourquoi
Les utilisateurs demandent sans cesse la même série à la minute. La calculer une fois à l'arrivée des blocs déplace le travail de chaque actualisation vers l'insertion. La table brute reste disponible pour les questions ad hoc.
Étape 1 — Interroger correctement les états agrégés
SELECT
minute,
token_id,
round(argMinMerge(open) * 100, 2) AS open_percent,
round(maxMerge(high) * 100, 2) AS high_percent,
round(minMerge(low) * 100, 2) AS low_percent,
round(argMaxMerge(close) * 100, 2) AS close_percent,
countMerge(updates) AS updates
FROM polymarket.market_midpoints_1m
WHERE minute >= now() - INTERVAL 30 MINUTE
GROUP BY minute, token_id
ORDER BY minute DESC, token_id
LIMIT 30;La vue a écrit argMinState/argMaxState ; la requête les finalise avec les fonctions Merge
correspondantes. Ouverture et clôture utilisent l'heure et l'identifiant déterministe, ce qui règle
de façon cohérente les arrivées désordonnées et égalités à la milliseconde.
Étape 2 — Comparer les lignes lues par les requêtes brute et agrégée
Exécutez l'équivalent brut :
SELECT
toStartOfMinute(event_at) AS minute,
token_id,
round(argMin(midpoint, tuple(event_at, event_id)) * 100, 2) AS open_percent,
round(max(midpoint) * 100, 2) AS high_percent,
round(min(midpoint) * 100, 2) AS low_percent,
round(argMax(midpoint, tuple(event_at, event_id)) * 100, 2) AS close_percent,
count() AS updates
FROM polymarket.price_ticks
WHERE midpoint > 0
AND event_at >= now() - INTERVAL 30 MINUTE
AND event_kind IN ('book_snapshot', 'price_change', 'best_bid_ask', 'rest_book')
GROUP BY minute, token_id
ORDER BY minute DESC, token_id
LIMIT 30;Dans SQL Console, comparez les lignes lues. L'agrégat lit des états de blocs que
AggregatingMergeTree combine en arrière-plan, généralement bien moins de lignes que toutes les
mises à jour source.
Étape 3 — Vérifier que la vue est alimentée par les insertions
SELECT
max(minute) AS newest_minute,
dateDiff('second', newest_minute, now()) AS age_seconds,
countMerge(updates) AS source_updates
FROM polymarket.market_midpoints_1m;En direct ou en fixture, newest_minute avance sans tâche d'actualisation planifiée.
Terminé lorsque
- la requête agrégée renvoie des lignes OHLC ;
- ouverture/plus haut/plus bas/clôture sont des probabilités comprises entre 0 et 100 ; et
newest_minuteest récent pour un flux actif.
Suite : étudier un mouvement de marché.