BigQuery中按月份实现累计去重客户数的方法咨询
BigQuery 累计唯一客户数实现方案
要实现截至每个月的累计唯一客户数,单纯用GROUP BY无法完成——GROUP BY只能计算单组内的聚合结果,无法跨组实现累计统计。不需要在BASE表新增列,以下两种方法可直接实现需求:
方法一:窗口函数直接计算(写法简单,小数据量适用)
利用窗口函数的COUNT(DISTINCT),按月份排序后累计统计从最早月份到当前月的所有唯一客户:
SELECT MONTH, COUNT(DISTINCT ID_CLIENT) OVER ( ORDER BY MONTH ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_unique_clients FROM BASE GROUP BY MONTH ORDER BY MONTH;
注意:大数据量下,窗口函数中的COUNT(DISTINCT)性能可能较差,推荐用方法二。
方法二:基于首次出现月份的累计求和(高性能,大数据量推荐)
先统计每个客户首次出现的月份,再对每个月累计之前所有月份的新客户数,总和即为累计唯一客户数:
WITH client_first_month AS ( -- 找出每个客户第一次出现的月份 SELECT ID_CLIENT, MIN(MONTH) AS first_seen_month FROM BASE GROUP BY ID_CLIENT ), all_months AS ( -- 提取BASE表中所有存在的月份 SELECT DISTINCT MONTH FROM BASE ) SELECT am.MONTH, -- 累计求和:统计截至当前月所有首次出现的客户总数 SUM(COUNT(cfm.ID_CLIENT)) OVER (ORDER BY am.MONTH) AS cumulative_unique_clients FROM all_months am LEFT JOIN client_first_month cfm ON am.MONTH = cfm.first_seen_month GROUP BY am.MONTH ORDER BY am.MONTH;
内容的提问来源于stack exchange,提问作者DART
相关产品推荐
相关产品推荐

