Morteza али Ахмади:
У меня есть таблица MySQL, который имеет некоторые записи следующим образом:
unix_timestamp value
1001 2
1003 3
1012 1
1025 5
1040 0
1101 3
1105 4
1130 0
...
Я хочу, чтобы вычислить среднее на каждые 10 эпох увидеть следующие результаты:
unix_timestamp_range avg_value
1001-1010 2.5
1011-1020 1
1021-1030 5
1031-1040 0
1041-1050 -1
1051-1060 -1
1061-1070 -1
1071-1080 -1
1081-1090 -1
1091-1100 -1
1101-1110 3.5
1111-1120 -1
1121-1130 0
...
Я видел , что некоторые подобные ответы хотели ввести описание ссылки здесь и введите описание ссылки здесь и введите описание ссылки здесь , но эти ответы не являются решением для моего конкретного вопроса. Как я могу получить вышеуказанные результаты?
Тим Biegeleisen:
Самый простой способ сделать это состоит в использовании таблицы календаря. Рассмотрим этот подход:
SELECT
CONCAT(CAST(cal.ts AS CHAR(50)), '-', CAST(cal.ts + 9 AS CHAR(50))) AS unix_timestamp_range,
CASE WHEN COUNT(t.value) > 0 THEN AVG(t.value) ELSE -1 END AS avg_value
FROM
(
SELECT 1001 AS ts UNION ALL
SELECT 1011 UNION ALL
SELECT 1021 UNION ALL
...
) cal
LEFT JOIN yourTable t
ON t.unix_timestamp BETWEEN cal.ts AND cal.ts + 9
GROUP BY
cal.ts
ORDER BY
cal.ts;
На практике, если у вас есть необходимость сделать этот вид запроса часто, вместо встроенного подзапроса помечен как cal
выше, вы можете иметь полный специальный стол , представляющий все диапазоны временных меток.