跨月同周日期Fcst值合并存储需求:按周首日展示并写入xy表
需求说明
需将分属不同月份但归属同一周的两个日期的Fcst数值相加,合并后以该周首日作为startdate展示,最终将处理完成的数据存储至xy表中。
原始数据
需将分属不同月份但归属同一周的两个日期的数量(Fcst)相加,合并后以该周首日作为展示日期
| Item | subm | loc | startdate | Type | Fcst |
|---|---|---|---|---|---|
| a | b | c | 26-02-2023 | 6 | 36.10988944 |
| a | b | c | 01-03-2023 | 6 | 48.14651925 |
| a | b | c | 05-03-2023 | 6 | 60.09763211 |
| a | b | c | 12-03-2023 | 6 | 23.84474793 |
期望输出格式
我需要得到如下格式的数据:
| Item | subm | loc | startdate | Type | Fcst |
|---|---|---|---|---|---|
| a | b | c | 26-02-2023 | 6 | 84.25640869 |
| a | b | c | 05-03-2023 | 6 | 60.09763211 |
| a | b | c | 12-03-2023 | 6 | 23.84474793 |
即将上述两个日期的Fcst值相加,并将结果存储至xy表中
解决方案
核心逻辑
- 将字符串格式的
startdate转换为日期类型,计算该日期所在周的首日(需确认周起始日定义,示例以周一为周首日) - 按
Item、subm、loc、Type及周首日分组,对Fcst字段求和 - 将处理后的数据插入
xy表
示例SQL(以MySQL为例)
-- 若xy表不存在则创建 CREATE TABLE IF NOT EXISTS xy ( Item VARCHAR(50), subm VARCHAR(50), loc VARCHAR(50), startdate VARCHAR(10), Type INT, Fcst DECIMAL(18,8) ); -- 插入处理后的数据 INSERT INTO xy SELECT Item, subm, loc, -- 计算周首日(周一为起始),并转为原日期格式 DATE_FORMAT( STR_TO_DATE(startdate, '%d-%m-%Y') - INTERVAL WEEKDAY(STR_TO_DATE(startdate, '%d-%m-%Y')) DAY, '%d-%m-%Y' ) AS startdate, Type, SUM(Fcst) AS Fcst FROM your_original_table GROUP BY Item, subm, loc, Type, -- 按ISO周分组,确保跨月同周数据被合并 YEARWEEK(STR_TO_DATE(startdate, '%d-%m-%Y'), 1);
其他数据库适配说明
- SQL Server:计算周首日可使用
DATEADD(day, 1 - DATEPART(weekday, CONVERT(DATE, startdate, 105)), CONVERT(DATE, startdate, 105)),分组用DATEPART(iso_week, CONVERT(DATE, startdate, 105))和YEAR(CONVERT(DATE, startdate, 105))组合 - PostgreSQL:用
date_trunc('week', TO_DATE(startdate, 'DD-MM-YYYY'))获取周首日,分组直接使用该截断后的值
内容的提问来源于stack exchange,提问作者Priyal Jain
相关产品推荐
相关产品推荐

