如何获取45天滚动报告周期内玩家数据?SQL查询需求
SQL周期分组查询实现
现有表结构与数据
表名:cool_off
| AccountID | CoolOff_Created_DT | CoolOff_End_DT | Endcycle45days |
|---|---|---|---|
| 12345 | 10-01-2022 00:48 | 13-01-2022 05:00 | 27-02-2022 05:00 |
| 12345 | 13-01-2022 11:43 | 17-01-2022 05:00 | 03-03-2022 05:00 |
| 12345 | 20-01-2022 03:42 | 23-01-2022 05:00 | 09-03-2022 05:00 |
| 12345 | 23-01-2022 15:32 | 29-01-2022 05:00 | 15-03-2022 05:00 |
查询需求
按AccountID分组,实现以下周期划分规则:
- 以每个账户的**首个
CoolOff_End_DT**为起始点,加45天得到首个周期的结束时间,该周期内所有记录的Endcycle45days统一设为这个结束时间 - 后续周期以上一周期的结束时间为起点,每45天划分为一个新周期,对应周期内的记录
Endcycle45days统一为当前周期的结束时间
SQL实现(MySQL版本)
WITH account_first_end AS ( -- 获取每个账户的首个CoolOff_End_DT SELECT AccountID, MIN(CoolOff_End_DT) AS first_end_dt FROM cool_off GROUP BY AccountID ), cycle_calculation AS ( -- 计算每条记录所属周期的结束时间 SELECT c.AccountID, c.CoolOff_Created_DT, c.CoolOff_End_DT, DATE_ADD( af.first_end_dt, INTERVAL (FLOOR(DATEDIFF(c.CoolOff_End_DT, af.first_end_dt) / 45) + 1) * 45 DAY ) AS Endcycle45days FROM cool_off c JOIN account_first_end af ON c.AccountID = af.AccountID ) -- 输出最终结果 SELECT * FROM cycle_calculation ORDER BY AccountID, CoolOff_End_DT;
其他数据库适配说明
- PostgreSQL:替换日期运算语法:
af.first_end_dt + INTERVAL '45 days' * (FLOOR((c.CoolOff_End_DT - af.first_end_dt) / INTERVAL '45 days') + 1) AS Endcycle45days - SQL Server:使用
DATEADD调整计算逻辑:DATEADD(DAY, (FLOOR(DATEDIFF(DAY, af.first_end_dt, c.CoolOff_End_DT) / 45) + 1) * 45, af.first_end_dt) AS Endcycle45days
预期输出
首个周期输出
| AccountID | CoolOff_Created_DT | CoolOff_End_DT | Endcycle45days |
|---|---|---|---|
| 12345 | 10-01-2022 00:48 | 13-01-2022 05:00 | 27-02-2022 05:00 |
| 12345 | 13-01-2022 11:43 | 17-01-2022 05:00 | 27-02-2022 05:00 |
| 12345 | 20-01-2022 03:42 | 23-01-2022 05:00 | 27-02-2022 05:00 |
| 12345 | 23-01-2022 15:32 | 29-01-2022 05:00 | 27-02-2022 05:00 |
下一周期输出(假设存在对应记录)
| AccountID | CoolOff_Created_DT | CoolOff_End_DT | Endcycle45days |
|---|---|---|---|
| 12345 | 07-03-2022 00:44 | 12-03-2022 05:00 | 26-04-2022 05:00 |
| 12345 | 15-04-2022 04:00 | 21-04-2022 18:00 | 26-04-2022 05:00 |
内容的提问来源于stack exchange,提问作者Atithi ranjan
相关产品推荐
相关产品推荐

