如何按每月22日至次月21日周期统计多表count、revenue等交易指标
解决方案
方案1:数仓/SQL层面直接计算(推荐,适合全量批量统计)
核心逻辑是先给每一行日维度数据打上对应计费月标签,再合并所有业务表后按计费月分组聚合即可。
通用SQL实现示例:
SELECT -- 生成计费月标签,格式为'yyyy-MM' CASE WHEN EXTRACT(DAY FROM dt) >= 22 THEN DATE_FORMAT(DATE_ADD(dt, INTERVAL 1 MONTH), '%Y-%m') ELSE DATE_FORMAT(dt, '%Y-%m') END AS billing_month, SUM(count) AS total_count, SUM(revenue) AS total_revenue, SUM(transaction_num) AS total_transaction FROM ( -- 对齐字段后合并所有需要统计的业务表 SELECT dt, count, revenue, transaction_num FROM business_table1 UNION ALL SELECT dt, count, revenue, transaction_num FROM business_table2 UNION ALL SELECT dt, count, revenue, transaction_num FROM business_table3 -- 更多业务表继续追加UNION ALL即可 ) all_business_data GROUP BY billing_month ORDER BY billing_month
优化提示
- 不同数据库语法适配:PostgreSQL可替换
DATE_ADD为+ interval '1 month',ClickHouse可使用toYYYYMM(date_add(MONTH, 1, dt))格式,核心逻辑通用 - 高频使用场景可提前构建公共日维度表,预存每个日期对应的计费月标签,后续统计直接关联该表即可,无需重复写判断逻辑,公共维度表参考结构:
| 日期dt | 对应计费月billing_month |
|---|---|
| 2020-12-21 | 2020-12 |
| 2020-12-22 | 2021-01 |
| 2021-01-21 | 2021-01 |
| 2021-01-22 | 2021-02 |
- 如需按客户、业务线等维度拆分统计,在
GROUP BY中追加对应维度字段即可
方案2:Python离线处理方案(适合小批量本地文件数据处理)
如果数据存储为CSV/Excel等本地文件,可使用pandas实现:
import pandas as pd # 1. 读取并合并所有业务表 file_list = ["table1.csv", "table2.csv", "table3.csv"] df_list = [] for f in file_list: df = pd.read_csv(f, parse_dates=["dt"]) df_list.append(df) full_df = pd.concat(df_list, ignore_index=True) # 2. 生成计费月标签 full_df["billing_month"] = full_df["dt"].apply( lambda x: (x + pd.DateOffset(months=1)).strftime("%Y-%m") if x.day >= 22 else x.strftime("%Y-%m") ) # 3. 按计费月聚合统计 stats_result = full_df.groupby("billing_month").agg( total_count=("count", "sum"), total_revenue=("revenue", "sum"), total_transaction=("transaction_num", "sum") ).reset_index().sort_values("billing_month") # 输出结果 print(stats_result) # stats_result.to_csv("billing_month_stats.csv", index=False)
边界逻辑校验
可通过题目给出的示例验证规则正确性:
2021年1月计费周期对应2020年12月22日-2021年1月21日
- 2020-12-22:日部分≥22,加1个月后得到2021-01,符合
- 2021-01-21:日部分<22,直接取当月2021-01,符合
- 2021-01-22:日部分≥22,加1个月后得到2021-02,对应2021年2月计费周期,符合规则
内容的提问来源于stack exchange,提问作者Fazza
相关产品推荐
相关产品推荐

