【问题标题】:Get average day or week values获取平均日或周值
【发布时间】:2015-02-26 10:31:18
【问题描述】:

我有这样的统计数据:

time        val1
1424166578  51
1424166877  55
1424167178  57
1424167477  57  

time 是一个 unix 时间戳。每 5 分钟有一个记录,不包括晚上和星期天。这种情况会持续数周。

现在我想获取平均一天和平均一周的这些值。结果应包括正常情况下每 5 分钟的值,但过去几天或几周的平均值。

结果应该是这样的:

time    val1
0       43.423
300     46.635
600     51.887
...

因此,时间可以是一个时间戳,具有自一天或一周开始以来的相对时间。也许最好使用DATETIME...不确定。

例如,如果我使用GROUP BY FROM_UNIXTIME(time, '%Y%m%d'),我会得到一整天的值。但我想要所有日子的所有平均值。

【问题讨论】:

  • 试试GROUP BY FROM_UNIXTIME(time, '%d.%m.%Y')
  • 这对我的代码没有任何影响,仍然每天只给我一个值。
  • 你能澄清一下吗?你一整天是什么意思?像 SUM(val1)...GROUP BY FROM_UNIXTIME(time, '%d.%m.%Y' ?
  • 您想要窗口大小等于 1 天或 1 周的移动/滑动平均值吗?
  • 好的,例如14:45:00 -> 43.423,其中42.423 是14:45 - 14:50 在过去7 天内每天的平均值?

标签: mysql sql group-by timestamp


【解决方案1】:

您似乎对按五分钟间隔而不是按日期分组日期感兴趣。这很简单:

SELECT
    HOUR(FROM_UNIXTIME(time)) AS HH,
    (MINUTE(FROM_UNIXTIME(time)) DIV 5) * 5 AS MM,
    AVG(val1) AS VAL
FROM your_table
WHERE time > UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL 7 DAY)
GROUP BY HH, MM

下面的结果将解释日期是如何被限制的:

time        FROM_UNIXTIME(time)  HH  MM
1424166578  2015-02-17 14:49:38  14  45
1424166877  2015-02-17 14:54:37  14  50
1424167178  2015-02-17 14:59:38  14  55
1424167477  2015-02-17 15:04:37  15  00

【讨论】:

  • 谢谢,正是我想要的!
【解决方案2】:

我会这样处理:

select date(from_unixtime(time)) as day, avg(val)
from table t
group by date(from_unixtime(time))
order by day;

虽然您可以使用格式参数,但我认为将值转换为字符串而不是日期/时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多