首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

InfluxDB 1.8 数据分组后如何正确显示时间GROUP BY time(15s,17s)的应用

一、GROUP BY time 应用问题

在 InfluxDB 的QQ交流群里,有一位群友问了这样一个问题:

查询一段时间范围内的数据,对数据按时间进行分组聚合。但是现在数据库的数据每分钟只有第17秒才有数据,查询后把第17s的数据给了15s。时间显示是错误的。这个问题该如何解决?

一位经验丰富的群友给出了解决方案:

# 第一次查询偏移量select first(字段) from (表名称) where time >= 2024-05-01 12:00:00

# 第二次查看数据group by time(1m, 17s),第二个参数就是偏移量

看完他的解决方案,我不禁惊叹,原来 time 是可以传递两个参数的!而我一直以来只用一个参数,主要是对时间的展示要求没那么高。

接下来我们就把这个问题从头到尾撸一遍。

二、GROUP BY time 使用说明

在 InfluxDB 1.8 中,GROUP BY time 子句用于根据时间范围对数据进行分组聚合。GROUP BY time 中的 time() 函数可以接受一个或多个参数来定义时间间隔。这些参数可以用来指定分组的时间间隔大小和偏移量。

Interval(时间间隔):必需的参数,用于指定分组的时间间隔大小。它可以是一个整数或带单位的时间值,例如 10m 表示10分钟,1h 表示1小时。支持的时间还有:ns 纳秒,us 微秒,ms 毫秒,s 秒,d 天,w 周。

Offset(偏移量,可选):可选的参数,用于指定分组时间间隔的起始点。它可以是一个整数或带单位的时间值。默认情况下,偏移量为 0。

示例:

SELECT MEAN("value") AS "mean_value"FROM "measurement"WHERE time > now() - 1hGROUP BY time(10m, 5m)

在上述示例中,time(10m, 5m) 指定了以10分钟为间隔进行分组聚合,并且偏移量为5分钟,即每隔10分钟计算一个分组,并从每个10分钟分组的起始点向后偏移5分钟。

三、偏移量的获取

在 InfluxDB1.8 中,如果需要从现有数据中动态计算偏移量,通常需要进行一些额外的计算步骤,因为InfluxDB本身不提供直接从数据动态生成偏移量的内置功能。但是,可以通过一些策略来实现这一需求。

1、使用外部工具计算偏移量

一个常见的方法是先使用查询从InfluxDB提取数据的特定特征(如最早或最晚时间戳),然后在应用层(如Java)中计算偏移量。这种方法适合在数据分析和数据预处理阶段使用。

第一步,查询数据中的最早或最晚时间戳:

SELECT FIRST("value"), LAST("value") FROM "measurement"

第二步,在应用层(例如Java)中获取这些时间戳并计算与当前时间的差异,以此作为偏移量。

Long hour = Duration.between(startTime, endTime).toHours();

2、在查询中估计偏移量

如果无法在应用层处理,还可以在InfluxDB查询中使用一些创造性的方法来近似计算偏移量,比如根据数据的发布频率估计。

假设数据每小时更新一次,并且希望分组数据以反映从每小时的第30分钟开始的时间段:

SELECT MEAN("value")FROM "measurement"WHERE time >= '2024-01-01T00:00:00Z' AND time < now()GROUP BY time(1h, 30m)

30m 是一个固定的偏移量,基于对数据更新模式的了解。

3、使用数据的统计特性

如果对数据的具体发布时间不确定,可以先统计数据的发布时间点,找出最常见的时间点作为偏移量。

第一步,查看每个小时内数据点的分布情况:

SELECT COUNT("value") FROM "measurement" GROUP BY time(1m)

第二步,分析这些数据点的分布,找到每小时中数据最频繁出现的分钟数,用该分钟数作为偏移量。

这3个方法的选择取决于我们对数据的了解程度,在实际操作中,可能需要结合多种策略来适应不同情况下的数据分析需求。

四、简单应用

来个简单的测试,测试一下群友给的解决方案是否能够解决问题。

1、第一步,在 InfluxDB 数据库中插入一批数据,它在每分钟的17秒更新一条。

2、第二步,获取偏移量。

偏移量我们知道的,为17s。省去查询和计算的步骤。

3、第三步,查询对比。

没加偏移量的数据展示:

select max(*::field) from sensor110 where time>'2024-05-14 06:40:00' group by time(1m) limit 10;

从截图中可以看到,时间是整分整分的。

加了偏移量的数据展示:

select max(*::field) from sensor110 where time>'2024-05-14 06:40:00' group by time(1m,17s) limit 10;

从截图中可以看出来,展示的时间是每分钟的17秒,而不是00秒了。

把分组时间再缩短一点:

从截图中可以看出来,只有17s的时候是有数据的。从测试结果来看,第二个群友给的方法是能够解决第一个群友问题的。

感谢群友的无私奉献,我把以上内容整理出来,希望能够帮助到遇到同类问题的小伙伴。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OjTebW-cUzS9IiBeQG8KYBLg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券