获取 unix 时间戳中每个特定时期范围内的值的平均值,其中 returns -1 在 MySQL 中的特定条件下
Get the average of values in every specific epoch ranges in unix timestamp which returns -1 in specific condition in MySQL
我有一个MySQL table,其中有一些记录如下:
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
...
我看到了一些类似的答案,例如 and enter link description here and enter link description here,但这些答案不是我的特定问题的解决方案。我怎样才能得到上面的结果?
最简单的方法是使用日历 table。考虑这种方法:
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
的内联子查询,您可能希望有一个完整的专用 table 代表所有时间戳范围。
我有一个MySQL table,其中有一些记录如下:
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
...
我看到了一些类似的答案,例如
最简单的方法是使用日历 table。考虑这种方法:
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
的内联子查询,您可能希望有一个完整的专用 table 代表所有时间戳范围。