繁体   English   中英

根据值的差异计算每天的平均值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM