InfluxDB count()函数返回错误值的问题咨询
我先理清楚你的问题:你在InfluxDB 1.8.6里存储Jenkins相关数据,执行不带count的嵌套查询时,能得到15条符合条件的SUCCESS记录,但其中存在重复的条目(比如test1的1600构建出现多次,test2的1669也重复)。但当你在外层用count(build_number)统计时,结果直接返回15,这和你预期的去重后的计数不符,是吧?
问题原因分析
你遇到的核心问题是子查询返回的15条结果里包含重复的记录,而count()函数默认会统计所有返回的行,不管是否重复。从你给出的无count查询结果来看,确实有很多重复的project_name + build_number组合,比如test1的1600构建出现了3次,test2的1669出现了4次,这些重复行都会被count()算进去,所以最终得到15,而不是你想要的“不同成功构建的数量”。
另外还要注意:InfluxDB的LIMIT 15是先取最新的15条数据,再过滤SUCCESS,这15条里可能本身就包含重复的构建记录,这也是导致count结果不符合预期的原因之一。
解决方案
根据你的需求,应该是要统计去重后的成功构建数量,这里分两种常见场景给出方案:
1. 统计去重后的所有成功构建总数
如果你想得到的是“不重复的成功构建条目数”,可以在子查询里先对project_name和build_number做去重,再统计:
SELECT count(distinct build_number) FROM ( SELECT DISTINCT project_name, build_number, build_result FROM "jenkins_data" WHERE ( "project_name" =~ /^(?i)(test1|test2)$/ AND "project_path" =~ /.*(?i)Playground.*$/ AND "build_result" = 'SUCCESS' ) ORDER BY time DESC LIMIT 15 )
或者更高效一点,把build_result = 'SUCCESS'放到内层查询,减少外层处理的数据量:
SELECT count(distinct build_number) FROM ( SELECT DISTINCT project_name, build_number FROM "jenkins_data" WHERE ( "project_name" =~ /^(?i)(test1|test2)$/ AND "project_path" =~ /.*(?i)Playground.*$/ AND "build_result" = 'SUCCESS' ) ORDER BY time DESC LIMIT 15 )
2. 按项目分组统计成功构建数
如果你想分别统计test1和test2各自的成功构建数,可以用GROUP BY:
SELECT count(distinct build_number) AS success_build_count FROM ( SELECT project_name, build_number FROM "jenkins_data" WHERE ( "project_name" =~ /^(?i)(test1|test2)$/ AND "project_path" =~ /.*(?i)Playground.*$/ AND "build_result" = 'SUCCESS' ) ORDER BY time DESC LIMIT 15 ) GROUP BY project_name
额外说明
- 为什么原始查询返回15?因为子查询返回的15条数据里,所有行的
build_number都被count了,哪怕重复的也会被算进去,这是count()函数的默认行为——统计行数,而不是去重后的数量。 - 如果你只是想统计子查询里SUCCESS的行数(不管重复),那原始查询的结果是对的,但显然这不是你想要的,所以核心是加上
DISTINCT关键字实现去重统计。
备注:内容来源于stack exchange,提问作者Sugatur Deekshith S N

