返回

MySQL 时间戳分组之谜:揭秘 SUM() 查询中的奥秘

mysql

时间戳分组之谜:揭秘 MySQL 中的 SUM() 查询

引言

在分析随着时间变化的数据时,经常需要将时间戳上的数据进行分组。例如,如果你想了解网站流量随着时间的推移而变化的情况,就需要将流量数据按时间分组。在 MySQL 中,可以使用 GROUP BYFLOOR() 函数对多个时间戳上的 SUM() 查询结果进行分组。

问题陈述

让我们以一个表为例,该表包含以下数据:

| Used | Timestamp           |
| ------ | --------------------- |
| 0    | 2023-03-12 12:30:04 |
| 0    | 2023-03-12 12:30:04 |
| 1    | 2023-03-12 12:30:04 |
| 1    | 2023-03-12 12:30:04 |
| 0    | 2023-03-12 12:30:54 |
| 0    | 2023-03-12 12:30:54 |
| 1    | 2023-03-12 12:30:54 |
| 0    | 2023-03-12 12:30:54 |

我们的目标是生成一个结果表,其中对每个唯一的时间戳(或时间戳加 10 秒)上的 Used 列求和。

解决方案

为了对多个时间戳上的 SUM() 查询结果进行分组,我们可以使用 GROUP BYFLOOR() 函数。FLOOR() 函数将时间戳向下舍入到指定的秒数。

SELECT SUM(used) AS sum_used,
       FLOOR(timestamp, 10) AS timestamp
FROM usage
GROUP BY timestamp
ORDER BY timestamp;

结果

上面的查询将产生以下结果:

| sum_used | timestamp           |
| ----------- | --------------------- |
| 2         | 2023-03-12 12:30:00 |
| 1         | 2023-03-12 12:30:50 |

正如你所看到的,结果被分组到最近的 10 秒。

常见问题解答

1. 为什么使用 FLOOR() 函数?

FLOOR() 函数用于将时间戳向下舍入到指定的秒数。在我们的例子中,我们将时间戳向下舍入到最近的 10 秒。这样做的目的是将相差不超过 10 秒的时间戳分组在一起。

2. 我可以用其他函数来分组时间戳吗?

是的,你可以使用其他函数来分组时间戳,例如 CEIL()ROUND()CEIL() 函数将时间戳向上舍入到指定的秒数,而 ROUND() 函数将时间戳四舍五入到指定的秒数。

3. 我可以在 Grafana 中使用此查询吗?

是的,你可以使用此查询在 Grafana 中创建图表。只需将 MySQL 数据源添加到 Grafana,然后运行该查询。然后,你可以创建一个图表,将 sum_used 作为值,timestamp 作为时间字段。

4. 我还可以使用此查询来做什么?

除了分组时间戳之外,还可以使用此查询来:

  • 计算一段时间内的平均值
  • 查找一段时间内最大的值
  • 查找一段时间内最小的值

5. 如果我的时间戳是字符串,该怎么办?

如果你要使用字符串时间戳,需要先将它们转换为时间戳格式。你可以使用 STR_TO_DATE() 函数将字符串时间戳转换为时间戳格式。

结论

对多个时间戳上的 SUM() 查询结果进行分组是一种在 MySQL 中分析随着时间变化的数据的有用技术。通过使用 GROUP BYFLOOR() 函数,你可以轻松地将时间戳分组到指定的秒数。