Mysql ows包含12行伪数据,即1到12的整数。然后,我们可以LEFT-OUTER-JOIN内部查询也作为派生表ws,它允许我们确保始终返回12行ws.sums在区间不包含数据时将为空,但我们可以使用它将其转换为0
我不完全确定它是否会完全按照您的要求运行,因此如果您使用它,您应该确保进行必要的测试,尤其是在间隔的边界上。不完全正确。我的返回189.4167,你的返回599.1045。不过,我不完全确定这是为什么。如果没有看到你的数据,我也很难弄明白。如果运行内部查询,这些总和是否看起来太大?这是从每个函数转储的SUM()的结果:好的,谢谢。我的Mysql ows包含12行伪数据,即1到12的整数。然后,我们可以LEFT-OUTER-JOIN内部查询也作为派生表ws,它允许我们确保始终返回12行ws.sums在区间不包含数据时将为空,但我们可以使用它将其转换为0,mysql,sql,performance,sum,average,Mysql,Sql,Performance,Sum,Average,我不完全确定它是否会完全按照您的要求运行,因此如果您使用它,您应该确保进行必要的测试,尤其是在间隔的边界上。不完全正确。我的返回189.4167,你的返回599.1045。不过,我不完全确定这是为什么。如果没有看到你的数据,我也很难弄明白。如果运行内部查询,这些总和是否看起来太大?这是从每个函数转储的SUM()的结果:好的,谢谢。我的TIMEDIFF参数顺序错误。我已经更新了我的答案。尽管这个数字还是要高得多,但更接近。将继续查看…是否希望在平均计算中包含0的间隔?不完全是。我的返回189.41
TIMEDIFF
参数顺序错误。我已经更新了我的答案。尽管这个数字还是要高得多,但更接近。将继续查看…是否希望在平均计算中包含0的间隔?不完全是。我的返回189.4167,你的返回599.1045。不过,我不完全确定这是为什么。如果没有看到你的数据,我也很难弄明白。如果运行内部查询,这些总和是否看起来太大?这是从每个函数转储的SUM()的结果:好的,谢谢。我的TIMEDIFF
参数顺序错误。我已经更新了我的答案。尽管这个数字还是要高得多,但更接近。将继续查看…是否希望在平均值计算中包含0的间隔?
SELECT (
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
10 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
5 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
15 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
10 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
20 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
15 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
25 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
20 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
30 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
25 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
35 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
30 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
40 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
35 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
45 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
40 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
50 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
45 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
55 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
50 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
60 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
55 MINUTE) THEN speed ELSE 0 END) +
SUM(CASE WHEN time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
65 MINUTE) AND time < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL
60 MINUTE) THEN speed ELSE 0 END)
)/12
FROM table
SELECT AVG(IFNULL(ws.sums, 0))
FROM
(
SELECT 1 i union all SELECT 2 union all SELECT 3 union all SELECT 4 union all SELECT 5 union all SELECT 6 union all SELECT 7 union all SELECT 8 union all SELECT 9 union all SELECT 10 union all SELECT 11 union all SELECT 12
) windows
LEFT JOIN
(
SELECT SUM(speed) sums,
FLOOR(TIME_TO_SEC(TIMEDIFF(CURRENT_TIMESTAMP, time)) / 300) window
FROM workers_speeds
WHERE TIME_TO_SEC(TIMEDIFF(CURRENT_TIMESTAMP, time)) / 60 < 65
AND TIME_TO_SEC(TIMEDIFF(CURRENT_TIMESTAMP, time)) / 60 > 5
GROUP BY FLOOR(TIME_TO_SEC(TIMEDIFF(CURRENT_TIMESTAMP, time)) / 300)
) ws on windows.i = ws.window