SQL实现基于创建日期字段的新增客户月度累计数量统计
实现客户月度累计数统计的SQL方案
核心思路
先把每条客户记录的创建日期对齐到当月第一天,统计每月新增的客户数,再对新增数做累加得到累计客户数即可。
通用SQL实现(适配大部分主流数据库)
WITH monthly_new AS ( -- 统计每个月的新增客户数 SELECT DATE_TRUNC('month', Create_Date::DATE) AS monthly_bucket, COUNT(DISTINCT Customer_Number) AS new_customer FROM customer_records -- 此处替换为你实际的表名 GROUP BY DATE_TRUNC('month', Create_Date::DATE) ) -- 计算累计客户数 SELECT SUM(new_customer) OVER (ORDER BY monthly_bucket) AS Customer_Count, -- 按要求格式输出月度分组为MM/DD/YYYY的每月第一天 TO_CHAR(monthly_bucket, 'MM/DD/YYYY') AS Monthly_Bucket FROM monthly_new ORDER BY monthly_bucket ASC;
不同数据库的适配调整
- MySQL环境:
DATE_TRUNC('month', Create_Date)替换为DATE_FORMAT(Create_Date, '%Y-%m-01'),日期格式化语法对应替换为DATE_FORMAT(monthly_bucket, '%m/%d/%Y') - SQL Server环境:
DATE_TRUNC('month', Create_Date)替换为DATEFROMPARTS(YEAR(Create_Date), MONTH(Create_Date), 1),日期格式化用FORMAT(monthly_bucket, 'MM/dd/yyyy') - Oracle环境:
DATE_TRUNC('month', Create_Date)替换为TRUNC(Create_Date, 'MONTH'),日期格式化保持TO_CHAR(monthly_bucket, 'MM/DD/YYYY')即可
可选优化
如果需要补全没有新增客户的月份,避免月度断层,可以先生成一个完整的连续月份临时表,再和上面的月度新增表关联,没有新增的月份补0之后再计算累计值即可。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

