You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写SQL代码实现同星期几近6周数据求和及数值预测

需求:SQL实现同星期几最近6周数据求和及下一期预测

需要编写SQL代码,实现对相同星期几的最近6周数据的num字段求和,并生成下一个同星期几的预测数值。

测试数据创建语句

create table #t (dy varchar(10), dt datetime, code varchar(4), wd varchar(10), num int)
insert into #t values
('星期三', '2023-03-01','c','101A',5),
('星期三', '2023-03-08','c','101A',3),
('星期三', '2023-03-15','c','101A',1),
('星期三', '2023-03-22','c','101A',1),
('星期三', '2023-03-29','c','101A',3),
('星期三', '2023-04-05','c','101A',2),
('星期三', '2023-04-12','c','101A',5),
('星期三', '2023-04-19','c','101A',2),
('星期三', '2023-04-26','c','101A',0),
('星期三', '2023-05-03','c','101A',6),
('星期三', '2023-05-10','c','101A',4),
('星期三', '2023-05-17','c','101A',3),
('星期三', '2023-05-24','c','101A',5),
('星期三', '2023-05-31','c','101A',1),
('星期三', '2023-05-07','c','101A',0),

('星期三', '2023-03-01','c','102A',4),
('星期三', '2023-03-08','c','102A',6),
('星期三', '2023-03-15','c','102A',4),
('星期三', '2023-03-22','c','102A',3),
('星期三', '2023-03-29','c','102A',6),
('星期三', '2023-04-05','c','102A',2),
('星期三', '2023-04-12','c','102A',1),
('星期三', '2023-04-19','c','102A',2),
('星期三', '2023-04-26','c','102A',3),
('星期三', '2023-05-03','c','102A',2),
('星期三', '2023-05-10','c','102A',5),
('星期三', '2023-05-17','c','102A',0),
('星期三', '2023-05-24','c','102A',1),
('星期三', '2023-05-31','c','102A',1),
('星期三', '2023-06-07','c','102A',0),

('星期二', '2023-02-28','d','101A',2),
('星期二', '2023-03-07','d','101A',3),
('星期二', '2023-03-14','d','101A',8),
('星期二', '2023-03-21','d','101A',10),
('星期二', '2023-03-28','d','101A',3),
('星期二', '2023-04-04','d','101A',2),
('星期二', '2023-04-11','d','101A',5),
('星期二', '2023-04-18','d','101A',2),
('星期二', '2023-04-25','d','101A',4),
('星期二', '2023-05-02','d','101A',6),
('星期二', '2023-05-09','d','101A',3),
('星期二', '2023-05-16','d','101A',4),
('星期二', '2023-05-23','d','101A',5),
('星期二', '2023-05-30','d','101A',1),
('星期二', '2023-06-06','d','101A',6),

('星期二', '2023-02-28','cd','103',5),
('星期二', '2023-03-07','cd','103',5),
('星期二', '2023-03-14','cd','103',4),
('星期二', '2023-03-21','cd','103',1),
('星期二', '2023-03-28','cd','103',3),
('星期二', '2023-04-04','cd','103',2),
('星期二', '2023-04-11','cd','103',4),
('星期二', '2023-04-18','cd','103',2),
('星期二', '2023-04-25','cd','103',0),
('星期二', '2023-05-02','cd','103',3),
('星期二', '2023-05-09','cd','103',2),
('星期二', '2023-05-16','cd','103',1),
('星期二', '2023-05-23','cd','103',5),
('星期二', '2023-05-30','cd','103',1),
('星期二', '2023-06-06','cd','103',0)

例如:针对2023-06-13,需要求和最近6条同星期几的数据(2023-06-06、2023-05-30、2023-05-23、2023-05-16、2023-05-09、2023-05-02)的num值

预期结果

create table #t_result (dy varchar(10), dt datetime, code varchar(4), wd varchar(10), num int)

insert into #t_result values
('星期二', '2023-06-13','cd','103',12),
('星期二', '2023-06-06','cd','103',12),
('星期二', '2023-05-30','cd','103',13),
('星期二', '2023-05-23','cd','103',12),
('星期二', '2023-05-16','cd','103',13),
('星期二', '2023-05-09','cd','103',14),
('星期二', '2023-05-02','cd','103',12),

('星期二', '2023-06-13','d','101A',25),
('星期二', '2023-06-06','d','101A',23),
('星期二', '2023-05-30','d','101A',24),
('星期二', '2023-05-23','d','101A',24),
('星期二', '2023-05-16','d','101A',22),
('星期二', '2023-05-09','d','101A',22),
('星期二', '2023-05-02','d','101A',26)

解决方案SQL代码

WITH ranked_data AS (
    SELECT 
        dy,
        dt,
        code,
        wd,
        num,
        -- 按分组内日期倒序排名
        ROW_NUMBER() OVER (PARTITION BY dy, code, wd ORDER BY dt DESC) AS rn,
        -- 获取分组内最新日期,用于生成下一个同星期几的日期
        MAX(dt) OVER (PARTITION BY dy, code, wd) AS max_dt
    FROM #t
),
summed_data AS (
    SELECT 
        dy,
        dt,
        code,
        wd,
        -- 对当前及后续5条(共6条)数据的num求和
        SUM(num) OVER (PARTITION BY dy, code, wd ORDER BY dt DESC ROWS BETWEEN CURRENT ROW AND 5 FOLLOWING) AS sum_num
    FROM ranked_data
    WHERE rn <= 7 -- 保留足够数据以生成有效求和结果
)
-- 合并原有日期的求和结果与预测记录
SELECT 
    dy,
    dt,
    code,
    wd,
    sum_num AS num
FROM summed_data
WHERE sum_num IS NOT NULL -- 过滤数据不足6条的无效记录
UNION ALL
-- 生成下一个同星期几的预测记录
SELECT 
    dy,
    DATEADD(week, 1, max_dt) AS dt,
    code,
    wd,
    SUM(num) AS num
FROM ranked_data
WHERE rn <= 6 -- 取最近6条数据求和
GROUP BY dy, code, wd, max_dt
ORDER BY dy, code, wd, dt DESC;

内容的提问来源于stack exchange,提问作者user2774355

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:54:55