分组统计每日去重联系人计数总和与全局计数不符的原因
问题原因与解决方法
核心原因
同一个contact如果在多个日期都有符合条件的点击记录,会导致两种统计逻辑出现本质差异:
- 全局统计
COUNT(DISTINCT contacts):不管该contact出现多少天,只会被计数一次,最终结果是所有符合条件的唯一contact总数。 - 按日期分组的
COUNT(DISTINCT contacts):每个日期都会统计当天的独立contact数,同一个contact在不同日期出现时,会在每个日期的结果里各被计数一次。把这些每日计数相加,就会重复计算跨天出现的contact,所以总和必然与全局统计结果不一致。
直观验证
比如某contact在10月1日和10月2日均有符合条件的点击:
- 全局统计会把这个contact算1次。
- 按日期分组统计时,10月1日和10月2日的计数里各包含这个contact1次,求和后这个contact被算2次,直接导致总和大于全局结果。
对应解决方法
场景1:希望每日统计总和等于全局唯一contact数
需要调整逻辑,让每个contact只在其首次出现的日期被计数:
WITH unique_contacts AS ( SELECT contacts, MIN(CAST(clicks.time AS DATE)) AS first_date FROM clicks WHERE clicks.campaign_id = 1234 AND clicks.type IN (1, 2, 3) GROUP BY contacts ) SELECT first_date AS `date`, COUNT(contacts) AS Totaly FROM unique_contacts GROUP BY first_date;
场景2:仅需统计每日独立访客数
当前的分组查询逻辑是正确的,只是不要将每日结果求和去和全局唯一数对比——两者统计维度完全不同,没有可比性。
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

