Charts
You write the aggregate; the card adds the time axis. A card's SQL never mentions
time. When it runs, the card injects the dashboard's time window and the
bucketing:
you write: SELECT COUNT(*) FROM http_request
card sends: SELECT time / 60 , COUNT(*) FROM http_request
WHERE time >= 1786250180 AND time < 1786253780
GROUP BY time / 60
One bucket per minute here. The bucket size is picked automatically, from 1 second up to
1 day, to fit the card's width at the current time range. Zoom in and the buckets get finer;
widen the card and you get more of them. Your WHERE clause is kept and combined
with the window.
Card types
| Graph over time | one line per series, bucketed as above. |
| Bar over time | same, drawn as grouped bars. |
| Stat | one number for the whole visible window. No buckets, just the window filter. |
| Section | a titled wrapper for grouping cards; no query. |
Multiple series
Two ways, and they combine:
SELECT status , COUNT(*) FROM http_request GROUP BY status
One series per status value. High-cardinality columns are capped at the 16
biggest series so a runaway label can't paint hundreds of lines.
SELECT AVG(ms) , PERCENTILE(ms, 95) FROM http_request
One series per aggregate. Series colours and labels are editable in the card's gear panel.
RATE()
Wrap an additive aggregate in RATE() and the card converts each bucket to a
per-second rate, so the line's shape stops depending on bucket size:
SELECT RATE(COUNT(*)) FROM http_request
reads as requests per second at every zoom level. On a Stat card, RATE() gives
the average rate over the visible window. Rate series get a /s label suffix.
Gaps and zeroes
Buckets with no events are gaps: lines bridge across them, bars leave space. If the whole
window has no matching rows the chart draws flat zero. RATE() series treat empty
buckets as true zero: no events genuinely means a rate of 0/s.
Rules
Chart queries need an aggregate (COUNT(*), AVG(ms), …), a
GROUP BY column pivots into series as above, and ORDER BY /
LIMIT don't apply inside cards; the time handling owns the shape of the result.
Everything else from the SQL page works as written.