04 Agregat real-time
Baca OHLC midpoint quote per menit yang dipelihara oleh materialized view inkremental.
Titik awal
Collector sudah healthy dan polymarket.price_ticks berisi baris data.
Mengapa
Pengguna dashboard berulang kali meminta seri per menit yang sama. Menghitungnya sekali saat blok baru masuk memindahkan pekerjaan dari setiap refresh dashboard ke waktu insert. Tabel raw tetap tersedia untuk pertanyaan ad-hoc.
Langkah 1 — Kueri aggregate state dengan benar
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;argMinState/argMaxState ditulis oleh view tersebut; query ini memfinalisasinya dengan
fungsi Merge yang bersesuaian. Open dan close memakai waktu event ditambah event ID yang deterministik,
sehingga kedatangan yang tidak berurutan dan seri pada milidetik yang sama terselesaikan secara konsisten.
Langkah 2 — Bandingkan baris yang dibaca query raw dan query agregat
Jalankan padanan raw-nya:
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;Di SQL console, bandingkan read rows kedua query itu. Query agregat membaca state
setingkat blok yang digabungkan AggregatingMergeTree di background, biasanya jauh lebih sedikit
barisnya dibanding memindai setiap update sumber.
Langkah 3 — Verifikasi view digerakkan oleh insert
SELECT
max(minute) AS newest_minute,
dateDiff('second', newest_minute, now()) AS age_seconds,
countMerge(updates) AS source_updates
FROM polymarket.market_midpoints_1m;Dalam mode live maupun fixture, newest_minute bergerak maju tanpa job refresh terjadwal.
Selesai bila
- query agregat mengembalikan baris OHLC;
- open/high/low/close berupa probabilitas antara 0 dan 100; dan
newest_minuteterkini untuk feed yang aktif.
Berikutnya: selidiki sebuah pergerakan market.