InfluxDB中含值字段与空值字段的数学运算异常求助
解决InfluxDB中字段相加时null值导致结果异常的问题
这个场景我之前处理过!核心问题就是当某个字段没有对应数据时,last()函数会返回null,而null和任何数值相加的结果都会是null,所以我们只需要把这些null值转换成0再计算就可以解决问题。
最优解决方案:使用coalesce()函数
InfluxDB的coalesce()函数可以返回参数列表里第一个非null的值,刚好能帮我们把缺失字段的null替换成0。修改后的查询语句如下:
SELECT coalesce(last("apples_count"), 0) + coalesce(last("oranges_count"), 0) AS "total_fruit_count" FROM "fruits" WHERE "market_id"='7' GROUP BY time(1d) FILL(null)
细节说明:
coalesce(last("oranges_count"), 0)的逻辑是:如果last("oranges_count")返回null(也就是该市场没有橙子数据),就用0代替;如果有值就直接用原数值。这样不管两个字段是否有缺失,相加结果都不会变成null。- 给
apples_count也加上coalesce()处理是更稳妥的做法,避免遇到某个市场只有橙子数据的反向场景。
兼容旧版本的替代方案
如果你使用的是InfluxDB 1.x之前的版本,coalesce()可能不支持,这时可以用if()函数实现同样的效果:
SELECT if(last("apples_count") IS NULL, 0, last("apples_count")) + if(last("oranges_count") IS NULL, 0, last("oranges_count")) AS "total_fruit_count" FROM "fruits" WHERE "market_id"='7' GROUP BY time(1d) FILL(null)
不过这种写法冗余度更高,优先推荐coalesce()的方案。
另外你原语句中的FILL(null)是针对时间分组后无数据的时间段填充null,和字段内的null值处理不冲突,可以保留。
内容的提问来源于stack exchange,提问作者Luis Nell
相关产品推荐
相关产品推荐

