InfluxDBMapper和QueryBuilder for Java指南第3部分:

本文档详细介绍了如何使用InfluxDBMapper和QueryBuilder在Java中执行复杂的分组查询。通过示例展示了如何按单个或多个标签、时间间隔进行分组,并演示了如何设置时间范围。
摘要由CSDN通过智能技术生成

以前,我们针对InfluxDB数据库执行了一些选择示例和聚合。 在本教程中,我们将按查询构建器提供给我们的功能检查分组。

在开始之前,您需要使用所需的数据启动一个influxdb实例。

假设我们要按单个标签分组,我们将使用groupBy函数。

 Query query = select().mean( "water_level" Query query = select().mean( "water_level" ).from(DATABASE, "h2o_feet" ).groupBy( "location" ); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

要执行的查询应为

 SELECT MEAN(water_level) FROM h2o_feet GROUP BY location; 

如果我们想按多个标签分组,我们将传递一个标签数组。

 Query query = select().mean( "index" ).from(DATABASE, "h2o_feet" ).from(DATABASE, "h2o_feet" ) 
                               .groupBy( "location" , "randtag" ); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

结果将是

 SELECT MEAN(index) FROM h2o_feet GROUP BY location,randtag; 

另一种选择是按所有标签查询。

 Query query = select().mean( "index" ).from(DATABASE, "h2o_feet" ).from(DATABASE, "h2o_feet" ) 
                               .groupBy(raw( "*" )); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 
 SELECT MEAN(index) FROM h2o_feet GROUP BY *; 

由于InfluxDB是一个时间序列数据库,因此我们可以根据时间对功能进行分组。

例如,让我们将查询结果分为12分钟间隔

 Query query = select().count( "water_level" Query query = select().count( "water_level" ).from(DATABASE, "h2o_feet" ) 
                               .where(eq( "location" , "coyote_creek" )) 
                               .and(gte( "time" , "2015-08-18T00:00:00Z" )) 
                               .and(lte( "time" , "2015-08-18T00:30:00Z" )) 
                               .groupBy(time(12l,MINUTE)); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

我们得到结果

 SELECT COUNT(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time (12m); 

按12分钟间隔和位置分组结果。

 Query query = select().count( "water_level" Query query = select().count( "water_level" ).from(DATABASE, "h2o_feet" ) 
                               .where() 
                               .and(gte( "time" , "2015-08-18T00:00:00Z" )) 
                               .and(lte( "time" , "2015-08-18T00:30:00Z" )) 
                               .groupBy(time(12l,MINUTE), "location" ); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

我们得到以下查询。

 SELECT COUNT(water_level) FROM h2o_feet WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time (12m),location; 

我们将获得更高级的查询结果,并将查询结果分为18分钟间隔,并将预设的时间范围向前移动。

 Query query = select().mean( "water_level" Query query = select().mean( "water_level" ).from(DATABASE, "h2o_feet" ) 
                               .where(eq( "location" , "coyote_creek" )) 
                               .and(gte( "time" , "2015-08-18T00:06:00Z" )) 
                               .and(lte( "time" , "2015-08-18T00:54:00Z" )) 
                               .groupBy(time(18l,MINUTE,6l,MINUTE)); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 
 SELECT MEAN(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time (18m,6m); 

或将查询结果分为12分钟间隔,然后将预设的时间范围向后移;

 Query query = select().mean( "water_level" Query query = select().mean( "water_level" ).from(DATABASE, "h2o_feet" ) 
                               .where(eq( "location" , "coyote_creek" )) 
                               .and(gte( "time" , "2015-08-18T00:06:00Z" )) 
                               .and(lte( "time" , "2015-08-18T00:54:00Z" )) 
                               .groupBy(time(18l,MINUTE,-12l,MINUTE)); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

结果将是

 SELECT MEAN(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time (18m,-12m); 

最终我们可以分组并填写

 Query query = select() 
                 .column( "water_level" ) 
                 "h2o_feet" .from(DATABASE, "h2o_feet" ) 
                 .where(gt( "time" , op(ti(24043524l, MINUTE), SUB, ti(6l, MINUTE)))) 
                 .groupBy( "water_level" ) 
                 .fill( 100 ); 
         LOGGER.info( "Executing query " +query.getCommand()); 
         QueryResult queryResult = influxDB.query(query); 

结果将是

 SELECT water_level FROM h2o_feet WHERE time > 24043524m - 6m GROUP BY water_level fill(100); 

而已! 我们只是对InfluxDB数据库进行一些非常复杂的分组查询。 使用查询构建器可以仅使用java创建查询。
您可以在github中找到源代码。

翻译自: https://www.javacodegeeks.com/2019/04/a-guide-to-the-influxdbmapper-and-querybuilder-for-java-part-3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值