我想计算特定表中多个不同形式为零的值与同一表中等于零的值之分
SELECT (count("value") WHERE value = 0 / count("value") WHERE value != 0) * 100 FROM "ping_rtt" WHERE time < now() - 15
显然这是错误的,我想知道怎样构造查询的正确方法。
答案 0 :(得分:1)
如果您的字段value
仅包含零或一;您可以轻松地将百分比计算为:
SELECT 100*sum(value)/count(value) from your_metric
或者直接使用Mean
函数代替count/sum
。
但是,如果value
由任意数字组成;有一个棘手的方法(基于当前InfluxDB实现将零/零计算为零这一事实):)您可以首先将字段value
映射为零和一,然后计算百分比:
SELECT 100*count(map_value)/sum(map_value) FROM (SELECT value/value as map_value FROM your_metric)
它在我的influxdb 1.6.0中正常工作;假设有一个名为metric
的度量标准,其中包含字段val
如下:
> select * from metric
name: metric
time tag val
---- --- ---
1539780859073434500 15
1539780862064944400 10
1539780865272757400 7
1539780867449546100 0
1539780880145442700 -8
1539781131768616600 12 0
1539781644977103800 12 0.5
1539781649113051900 12 1.5
如您所见,有不同的浮点数,如0,-8、1.5、0.5等。
我们现在可以将val
字段映射为零或一:
> select val/val as normal_val from metric
name: metric
time normal_val
---- ----------
1539780859073434500 1
1539780862064944400 1
1539780865272757400 1
1539780867449546100 0
1539780880145442700 1
1539781131768616600 0
1539781644977103800 1
1539781649113051900 1