SQL中COUNT函数统计结果不准确问题求助
问题分析:SQL统计结果与实际数据不符的原因及解决办法
我写了两条SQL查询语句:第一条筛选日期及对应的attribute_value,下载数据后发现2022年12月7日对应12条值;但第二条用COUNT(attribute_value)统计该日期的数量时,结果显示为139而非12。请问哪里操作有误?
两条SQL语句如下:
SELECT DATE(b.block_timestamp) AS timestamp, attribute_value FROM `immaculate-355716.stride_1.event_attributes` ea INNER JOIN `immaculate-355716.stride_1.blocks` b ON CAST(ea.block_height AS STRING) = b.block_height WHERE ea.attribute_key = 'packet_src_port' AND ea.attribute_value LIKE 'icacontroller%' GROUP BY 1,2 ORDER BY 1 DESC
SELECT DATE(b.block_timestamp) AS timestamp, COUNT(attribute_value) AS count FROM `immaculate-355716.stride_1.event_attributes` ea INNER JOIN `immaculate-355716.stride_1.blocks` b ON CAST(ea.block_height AS STRING) = b.block_height WHERE ea.attribute_key = 'packet_src_port' AND ea.attribute_value LIKE 'icacontroller%' GROUP BY 1 ORDER BY 1 DESC
核心问题原因
- 第一条SQL通过
GROUP BY 1,2(按日期和attribute_value分组),返回的是去重后的日期+属性值组合,2022-12-07的12条是当天不同attribute_value的数量,而非原始数据的总条数。 - 第二条SQL仅按日期分组,
COUNT(attribute_value)统计的是所有符合条件的原始记录总数(未去重),所以139是当天满足筛选条件的全部原始数据量,和第一条的去重结果自然存在差异。
修正方案
根据你的需求选择对应调整:
- 若要统计去重后的
attribute_value数量(和第一条记录数匹配),将第二条SQL的COUNT(attribute_value)改为COUNT(DISTINCT attribute_value):
SELECT DATE(b.block_timestamp) AS timestamp, COUNT(DISTINCT attribute_value) AS count FROM `immaculate-355716.stride_1.event_attributes` ea INNER JOIN `immaculate-355716.stride_1.blocks` b ON CAST(ea.block_height AS STRING) = b.block_height WHERE ea.attribute_key = 'packet_src_port' AND ea.attribute_value LIKE 'icacontroller%' GROUP BY 1 ORDER BY 1 DESC
- 若第一条SQL原本想获取所有原始数据而非去重结果,直接去掉第一条SQL中的
GROUP BY 1,2,此时下载的原始数据条数会和第二条的COUNT(attribute_value)结果一致。
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

