以前,我们针对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中找到源代码。