You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BigQuery中计算2018-01-01至每月末的累计唯一客户数?

累计月度唯一客户总量统计方案

需求说明

需要统计从2018-01-01到当前年度每个月末的累计唯一客户数,例如:

  • 2022年1月统计2018-01-01至2022-01-31的唯一客户总数
  • 2022年2月统计2018-01-01至2022-02-28/29的唯一客户总数
    以此实现月度环比分析,现有SQL仅能查询单个月份的结果,需调整为批量输出所有目标月份的统计数据。

现有SQL问题

当前SQL固定了日期范围,无法自动生成每个月末的累计统计:

select count(distinct customername) from table
where billingdate between "2018-01-01" and "2022-01-30";

解决方案

通过生成目标月末日期序列,结合子查询批量计算每个日期的累计唯一客户数,以下是主流数据库的实现代码:

MySQL 版本

WITH monthly_end_dates AS (
    SELECT LAST_DAY(date_add('2018-01-01', INTERVAL (n-1) MONTH)) AS end_date
    FROM (
        SELECT @row := @row + 1 AS n FROM 
        (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) t1,
        (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) t2,
        (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t3,
        (SELECT @row := 0) t0
    ) nums
    WHERE end_date <= LAST_DAY(CURDATE())
)
SELECT 
    end_date AS 统计月末日期,
    (SELECT COUNT(DISTINCT customername) FROM table WHERE billingdate BETWEEN '2018-01-01' AND med.end_date) AS 累计唯一客户数
FROM monthly_end_dates med
ORDER BY end_date;

PostgreSQL 版本

WITH monthly_end_dates AS (
    SELECT generate_series(
        date_trunc('month', '2018-01-01'::date) + interval '1 month - 1 day',
        date_trunc('month', current_date) + interval '1 month - 1 day',
        interval '1 month'
    )::date AS end_date
)
SELECT 
    end_date AS 统计月末日期,
    (SELECT COUNT(DISTINCT customername) FROM table WHERE billingdate BETWEEN '2018-01-01' AND med.end_date) AS 累计唯一客户数
FROM monthly_end_dates med
ORDER BY end_date;

SQL Server 版本

WITH monthly_end_dates AS (
    SELECT DATEADD(DAY, -1, DATEADD(MONTH, n, '2018-01-01')) AS end_date
    FROM (
        SELECT TOP (DATEDIFF(MONTH, '2018-01-01', GETDATE()) + 1) 
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS n
        FROM sys.all_columns
    ) nums
    WHERE end_date <= EOMONTH(GETDATE())
)
SELECT 
    end_date AS 统计月末日期,
    (SELECT COUNT(DISTINCT customername) FROM table WHERE billingdate BETWEEN '2018-01-01' AND med.end_date) AS 累计唯一客户数
FROM monthly_end_dates med
ORDER BY end_date;

注意事项

  • 替换代码中的table为实际业务表名
  • 若customername或billingdate字段名与实际不符,需对应修改
  • 结果按日期升序排列,可直接对比相邻月份的累计客户数实现环比分析

内容的提问来源于stack exchange,提问作者user17239308

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:40:33