mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-09-02 09:03:45 +00:00
The payload-breakdown and top-observers matviews stored a single 7-day total per group, so the 24h/7d/30d selector did nothing: payload ignored the window entirely (the store discarded `since`) and top-observers only varied which rows cleared the last_heard cutoff, never the counts. Bucket both views by hour over a 30-day horizon and sum the buckets in range, mirroring mv_hourly_iata_stats. The stats endpoints now honour the requested window while still reading a small precomputed table.
18 lines
634 B
SQL
18 lines
634 B
SQL
-- Precomputed payload breakdown, bucketed by hour so the stats endpoint can
|
|
-- serve any window (24h/7d/30d) by summing the buckets in range instead of
|
|
-- scanning a month of observations per request.
|
|
|
|
CREATE MATERIALIZED VIEW mv_payload_breakdown_by_iata AS
|
|
SELECT
|
|
iata,
|
|
payload_type,
|
|
date_trunc('hour', heard_at)::timestamptz AS bucket,
|
|
COUNT(*) AS count
|
|
FROM packet_observations
|
|
WHERE heard_at > NOW() - INTERVAL '30 days'
|
|
AND payload_type IS NOT NULL
|
|
GROUP BY iata, payload_type, date_trunc('hour', heard_at);
|
|
|
|
CREATE UNIQUE INDEX idx_mv_payload_breakdown
|
|
ON mv_payload_breakdown_by_iata(iata, payload_type, bucket);
|