我在InfluxDB中使用的"measurement"名称度量数据如下(id和status是tags,value是field
{id:"string", status: "string", value: "long"}
我想要描述的每一个进程都可以经历这样的许多状态:A-> B -> C -> A等等。现在我想显示每个status的最终状态的计数--我对临时状态不感兴趣。
例如,对于如下所示的数据集(假设每条新记录都有一个更新的timestamp):
{id:"X", state:"A", value: 1} {id: "X", state: "B", value: 2} {id: "X", state: "C", value: 3} {id: "X", state: "A", value: 1} {id: "Y", state: "A", value: 1} {id: "Y", state: "B", value: 2} {id: "Y", state: "C", value: 3}
我想得到这样的结果:{state: "A", count: 1},{state: "C", count: 1}
现在,我可以通过这样显式地指定state:SELECT count("status") FROM (SELECT last("value"),"status" FROM "measurement" WHERE $timeFilter GROUP BY "id") WHERE "status" =~ /^A$/来实现这一点。
但是,我希望有一个具有所有可能状态的预定义变量,这样我就不需要对每个状态重复该查询。如果我尝试这样的方法:
SELECT count("status") FROM (SELECT last("value"),"status" FROM "measurement" WHERE $timeFilter GROUP BY "id") WHERE "status" =~ /^$var_statuses$/ GROUP BY "status",其中var_statuses是可能的状态列表,如:["A","B","C"]。
我的结果是:{state: "A", count: 2},{state: "B", count: 2}, {state: "C", count: 2},因为在开头和结尾之间有一些临时状态。
是否有任何方法来转换我的查询以便使其工作?
发布于 2022-06-07 02:45:28
通过InfluxQL,您可能暂时无法使用regex,因为没有变量支持或在算子中。您可以尝试以下regex查询:
SELECT count("status") FROM (
SELECT last("value"),"status"
FROM "measurement"
WHERE $timeFilter
GROUP BY "id"
)
WHERE "status" =~ /(A|B|C)/
GROUP BY "status"如果您正在使用InfluxDB v2,您也可以尝试熔剂 (这是一种脚本语言,并提供了更多的灵活性):
from(bucket:"your-bucket")
|> range(start: $timeFilterStart, stop: $timeFilterStop)
|> filter(fn: (r) => r._measurement == "measurement" and r._field == "value" and r.status = $var_statuses )
|> group(columns: ["status"])在那里,您可以使用变量进行替换。
这是博客讨论如何将InfluxQL转换为Flux。
https://stackoverflow.com/questions/72521225
复制相似问题