在我的InfluxDB(V1.8(中,我有一个带有一个字段("value"(和一个标签("id"(的测量值,还有很多系列。该测量中有两种系列,一种包含原始数据(浮点值(,另一种包含验证数据(浮点数值=0.0或1.0(。总有两个系列属于一起(id="xyz_data"和id="xyz_validation"(,并且它们具有相同的时间戳。
我想查询数据,以便只接收验证序列值为1的数据。
示例:
xyz_data包含:2.3、5.4、0.0、2.1、6.4
xyz_validation包含:1.0、0.0、1.0、1.0、0.0
我希望查询返回:2.3、0.0、2.1
使用InfluxQL有办法做到这一点吗?
与此同时,我找到了某种解决方案,对我的情况有帮助,但不是很好。它还要求数据点之间的持续时间是恒定的,或者点之间至少有一个最小持续时间:
SELECT "val" FROM (SELECT sum("value")-1 AS "val", count("value") AS "cnt" FROM "channel" WHERE "id" = 'xyz_data' OR ("id" = 'xyz_validation' AND value > 0) AND $timeFilter GROUP BY time(1s)) where "cnt" > 1
在内部select语句中,它从数据序列中获取所有数据点,而仅从验证序列中获取有效点。它还按时间分组,其中分组时间间隔需要等于或小于数据频率。然后有三种情况:一个组不包含数据点,一个数据点(然后由于缺少验证数据点而无效(或两个数据点。为了能够仅过滤有效点,我使用了此处的点计数("cnt"(和外部select语句中的过滤器,以仅返回计数器>1.为了得到数据点值,我只取数据点和验证点的和,减去1,因为我知道验证数据点的值总是1。
当我试图进入通量时,我设法通过在通量查询语言中使用pivot来解决这个问题:
from(bucket: "default")
|> range(start: 2016-06-12, stop: 2016-06-14)
|> filter(fn: (r) => r["_measurement"] == "stack")
|> pivot(rowKey: ["_time"], columnKey: ["id"], valueColumn: "_value")
|> filter(fn: (r) => r["xyz_validation"] == 1.0)
|> keep(columns: ["_time", "xyz_data"])
前三行根据所选的bucket、时间和测量值选择数据,然后pivot将id放入具有value列中值的列中。像这样,您可以对xyz_validation进行筛选,然后获得xyz_data列。
您可以在Influx DB UI中使用Explore选项卡中的脚本生成器进行尝试,它适用于Influx DB1.8和2.x.