Пожалуйста, убедитесь, что вы знаете, какие данные вы на самом деле агрегируете с time_bucket
:
TIMESTAMPTZ сгруппированы по времени в UTC.Таким образом, выравнивание ведер происходит по времени UTC.Одним из следствий этого является то, что ежедневные сегменты выровнены по полуночи UTC, а не по местному времени.
Как уже указывалось @TmTron, фактической верной версией для месяцев и лет будет использование date_trunc
в качествеследует:
SELECT
date_trunc('month', measured_at) AS month,
MAX(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) - MIN(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) as consumption
FROM readings
WHERE device_id = 4
GROUP BY 1
ORDER BY 1 DESC LIMIT 12;
... и:
SELECT
date_trunc('year', measured_at) AS year,
MAX(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) - MIN(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) as consumption
FROM readings
WHERE device_id = 4
GROUP BY 1
ORDER BY 1 DESC LIMIT ...;
И если вы выбираете только определенный интервал (например, последние 12 месяцев), пожалуйста, всегда добавьтекритерии уменьшения количества сканируемых разделов, например:
SELECT
date_trunc('month', measured_at) AS month,
MAX(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) - MIN(CAST(data->>'1_8_0' AS DOUBLE PRECISION)) as consumption
FROM readings
WHERE device_id = 4
AND measured_at >= CURRENT_TIMESTAMP - '13 months'::interval
GROUP BY 1
ORDER BY 1 DESC LIMIT 12;