需按 **自定義天數** (如 11 天、7 天、30 天) 對時間序列數據分組聚合,而非固定日/週/月。
SELECT
job_id,
COUNT(*) AS group_num
FROM your_table
GROUP BY
job_id,
DAYOFYEAR(`date`) DIV 11; -- 關鍵:一年天數除以分組天數取整
-- 建表測試
CREATE TABLE t_log (
id INT AUTO_INCREMENT PRIMARY KEY,
job_id INT,
log_date DATE
);
-- 插入跨年測試數據
INSERT INTO t_log(job_id, log_date) VALUES
(1, '2023-12-28'), (1, '2023-12-30'), (1, '2024-01-02'), (1, '2024-01-10');
-- 按 3 天分組 (跨年驗證)
SELECT
job_id,
DAYOFYEAR(log_date) DIV 3 AS grp,
COUNT(*) AS cnt,
MIN(log_date) AS start_dt,
MAX(log_date) AS end_dt
FROM t_log
GROUP BY job_id, DAYOFYEAR(log_date) DIV 3
ORDER BY job_id, grp;
job_id | grp | cnt | start_dt | end_dt
-------|-----|-----|------------|------------
1 | 122 | 2 | 2023-12-28 | 2023-12-30 (第 362,364 天 → DIV 3 = 120,121? 待驗證)
1 | 0 | 2 | 2024-01-02 | 2024-01-10 (第 2,10 天 → DIV 3 = 0,3)
⚠️ **跨年邊界問題**:`DAYOFYEAR` 按自然年重置,**跨年分組會斷裂** (如 12/31 與 1/1 不在同組)。
-- 方案:以某固定基準日為起點計算天數差
SELECT
job_id,
FLOOR(DATEDIFF(log_date, '2020-01-01') / 11) AS grp,
COUNT(*) AS cnt
FROM t_log
GROUP BY job_id, FLOOR(DATEDIFF(log_date, '2020-01-01') / 11);