[英]Calculate average per day based on the difference of the values
我有一张桌子:
价值 | 更新时间 | ID |
---|---|---|
5 | 2022-1-1 12:00:00 | 1 |
10 | 2022-1-1 12:00:30 | 2 |
20 | 2022-1-1 12:02:30 | 3 |
我想要做的是根据updated_at
列的差异以及当然的值来获得平均值。
所以,我想公式应该是:
(sumof((value2 - value1) * (date2 - date1))) / (dateLast - dateFirst)
当我们从第一个项目遍历到最后一个项目时,其中 1 和 2 表示每两行。 例如,对于这张桌子,我们将拥有:
第一行和第二行: (value2 - value1) * (date2 - date1)
= (10 - 5) * (30 (seconds))
= 150
第二行和第三行: (20 - 10) * 120
= 1200
所以结果是:
(1200 + 150) / (2022-1-1 12:02:30 - 2022-1-1 12:00:00) = 9
我可能可以使用 ID 和 ID + 1 上的自我 JOIN 来完成这项工作,我也可以计算最后一个日期和第一个日期的差异,但我不能在同一个查询中同时执行它们,我不知道该怎么做? 这甚至可以在单个查询中完成吗?
更新
我的 MySql 版本是 5.6
对于 MySql 8.0+,您可以使用LAG()
window function 获取每一行的先前值,然后聚合:
WITH cte AS (
SELECT *,
value - LAG(value) OVER (ORDER BY updated_at) dif_value,
UNIX_TIMESTAMP(updated_at) - UNIX_TIMESTAMP(LAG(updated_at) OVER (ORDER BY updated_at)) dif_time
FROM tablename
)
SELECT SUM(dif_value * dif_time) /
(UNIX_TIMESTAMP(MAX(updated_at)) - UNIX_TIMESTAMP(MIN(updated_at))) result
FROM cte;
对于以前的版本,如果 id 之间没有间隙,请使用自联接:
SELECT SUM(dif_value * dif_time) /
(UNIX_TIMESTAMP(MAX(updated_at)) - UNIX_TIMESTAMP(MIN(updated_at))) result
FROM (
SELECT t1.*,
t1.value - t2.value dif_value,
UNIX_TIMESTAMP(t1.updated_at) - UNIX_TIMESTAMP(t2.updated_at) dif_time
FROM tablename t1 LEFT JOIN tablename t2
ON t1.ID = t2.ID + 1
) t;
请参阅演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.