SQL时间序列统计核心是按业务节奏设计时间维度:先明确分组粒度(日/小时/周)、补全缺失日期、用LAG/LEAD做同比环比、加索引和分区提速。

SQL时间序列统计的核心是把时间字段当维度用,按需切片、聚合、对齐,而不是硬套复杂函数。关键不在“怎么写”,而在“怎么想”——先理清业务节奏(比如按天/小时滚动?是否要补全缺失日期?是否需同比环比?),再选对应策略。
时间分组要对齐业务粒度
别直接用 DATE(created_at) 或 YEAR(created_at) 就完事。得看业务真实需求:
- 想看“每天凌晨0点到次日0点”的销量?用 DATE(created_at) 最稳
- 要“每小时整点汇总”(如 9:00–10:00)?用 DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') 或 CONCAT(DATE(created_at), ' ', HOUR(created_at), ':00:00')
- 需按自然周(周一至周日)统计?用 DATE_SUB(created_at, INTERVAL WEEKDAY(created_at) DAY) 定位周一
缺失时间点必须主动补全
原始数据往往有空档(比如某天没订单),但报表常要求“连续日期轴”。纯 GROUP BY 会跳过空天,得自己造时间序列:
- MySQL 8.0+:用 RECURSIVE CTE 生成日期表,再 LEFT JOIN 原表
- 低版本 MySQL / PostgreSQL:建一张小的 dates 辅助表(含近3年所有日期),JOIN 时加条件限制范围
- 临时应急:用 UNION ALL 拼几段日期(适合固定短周期,如最近7天)
同比环比别硬算,用窗口函数降耦合
用 LAG() 和 LEAD() 直接拉同行数据,比自连接或子查询清晰又快:
标签: mysql
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~