如何为MySQL表中每一行生成时间序列?
解决方案
你只需要将生成时间序列的递归CTE和USER_TABLE做交叉连接(CROSS JOIN),就能得到每个用户对应全量时间序列的结果,无需临时表。
首先修正你原有的时间序列CTE:
- 把时间间隔从1分钟改成10分钟,匹配需求
- 修正起始时间和终止条件的逻辑,避免生成多余数据
完整SQL语句如下:
WITH RECURSIVE times AS ( -- 起始时间,转换为日期类型便于计算 SELECT STR_TO_DATE('2022-10-15 00:00:00', '%Y-%m-%d %H:%i:%s') AS ts UNION ALL -- 每次生成下一个10分钟的时间点 SELECT ts + INTERVAL 10 MINUTE FROM times -- 终止条件:不超过当日最后一个10分钟间隔点 WHERE ts < STR_TO_DATE('2022-10-15 23:50:00', '%Y-%m-%d %H:%i:%s') ) -- 交叉连接用户表与时间序列,生成每个用户的全量时间条目 SELECT u.userid, DATE_FORMAT(t.ts, '%Y-%m-%d %H:%i:%s') AS timestamp FROM USER_TABLE u CROSS JOIN times t ORDER BY u.userid, t.ts;
关键说明:
- 递归CTE
times负责生成指定日期内所有10分钟间隔的时间点 CROSS JOIN会自动将每个用户与所有时间点进行组合,完全匹配你期望的输出结构- 最终通过
ORDER BY保证结果按用户ID、时间顺序排列
如果需要调整时间范围,只需修改CTE中的起始时间和终止时间即可。
内容的提问来源于stack exchange,提问作者bossdeep
相关产品推荐
相关产品推荐

