如何通过SQL复制行并偏移日期扩展供应链预测模型?
解决方案
要实现你的需求,有两种简单的SQL写法,适合基础薄弱的场景快速上手:
方法1:用UNION ALL逐次拼接(直观易懂)
直接把原数据、加1年、加2年、加3年的结果拼接起来,同时添加对应的年份标签:
-- 原年份(标记为'0') SELECT delivery_date, component_type, qty, [other columns], '0' AS forecast_year FROM [Table] UNION ALL -- 加1年(标记为'1') SELECT DATEADD(year, 1, delivery_date) AS delivery_date, component_type, qty, [other columns], '1' AS forecast_year FROM [Table] UNION ALL -- 加2年(标记为'2') SELECT DATEADD(year, 2, delivery_date) AS delivery_date, component_type, qty, [other columns], '2' AS forecast_year FROM [Table] UNION ALL -- 加3年(标记为'3') SELECT DATEADD(year, 3, delivery_date) AS delivery_date, component_type, qty, [other columns], '3' AS forecast_year FROM [Table]
*注意:不同数据库的日期加法函数写法有差异:
- MySQL用
DATE_ADD(delivery_date, INTERVAL 1 YEAR) - PostgreSQL用
delivery_date + INTERVAL '1 YEAR'*
方法2:用交叉连接(更简洁,适合后续扩展)
先定义一个包含年份偏移量和标签的临时集合,再和原表交叉连接,一次性生成所有结果:
-- SQL Server写法 SELECT DATEADD(year, y.offset_years, t.delivery_date) AS delivery_date, t.component_type, t.qty, t.[other columns], CAST(y.offset_years AS VARCHAR(1)) AS forecast_year FROM [Table] t CROSS JOIN ( VALUES (0), (1), (2), (3) ) y(offset_years) -- MySQL写法 SELECT DATE_ADD(t.delivery_date, INTERVAL y.offset_years YEAR) AS delivery_date, t.component_type, t.qty, t.[other columns], CAST(y.offset_years AS CHAR(1)) AS forecast_year FROM [Table] t CROSS JOIN ( SELECT 0 AS offset_years UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ) y -- PostgreSQL写法 SELECT t.delivery_date + INTERVAL y.offset_years || ' YEAR' AS delivery_date, t.component_type, t.qty, t.[other columns], CAST(y.offset_years AS VARCHAR(1)) AS forecast_year FROM [Table] t CROSS JOIN ( VALUES (0), (1), (2), (3) ) y(offset_years)
这种写法的好处是如果后续需要增加更多年份(比如加4年),只需要在临时集合里加一行即可,不用重复写SELECT语句。
内容的提问来源于stack exchange,提问作者vjr2109
相关产品推荐
相关产品推荐

