SQL Unpivot 滚动日期/周计算

SQL Unpivot Rolling Date/Week Calculation

提问人:Ronak Vachhani 提问时间:11/11/2023 最后编辑:Ronak Vachhani 更新时间:11/13/2023 访问量:54

问:

这是我原来的桌子。它有一个预测发布日期和 6 列,表示 6 周的预测,然后是原始周日期。

Forecast_Release_Date Adj_Fcst_1 Adj_Fcst_2 Adj_Fcst_3 Adj_Fcst_4 Adj_Fcst_5 Adj_Fcst_6
03-09-2023 299 312 309 248 282 270

预测周 1 = 10-09-2023

预测第 2 周 = 17-09-2023

预测第 3 周 = 24-09-2023

预测第 4 周 = 01-10-2023

预测第 5 周 = 08-10-2023

预测第 6 周 = 15-10-2023

我已经成功地将列取消透视为行。

Forecast_Release_Date Forecast_Release_Week Adjusted_Forecast
03-09-2023 10-09-2023 299
03-09-2023 10-09-2023 312
03-09-2023 10-09-2023 309
03-09-2023 10-09-2023 248
03-09-2023 10-09-2023 282
03-09-2023 10-09-2023 270

这是我的查询:

SELECT Forecast_Release_Date
    ,DATEADD(Week, 1, Forecast_Release_Date) AS Forecast_Week
    ,Adjusted_Forecast
FROM (
    SELECT SourceFileInsertDateTime AS Forecast_Release_Date
        ,Adj_Fcst_1
        ,Adj_Fcst_2
        ,Adj_Fcst_3
        ,Adj_Fcst_4
        ,Adj_Fcst_5
        ,Adj_Fcst_6
    FROM MyTable
    ) p
UNPIVOT(Adjusted_Forecast FOR [Week] IN (
            Adj_Fcst_1
            ,Adj_Fcst_2
            ,Adj_Fcst_3
            ,Adj_Fcst_4
            ,Adj_Fcst_5
            ,Adj_Fcst_6
            )) AS unpvt

但我似乎无法获得Forecast_Release_Week列的滚动每周日期,即第一行应该是 10-09,第二行 = 17-09,依此类推。

注意:这必须是基于发布日期列的动态,而不是 硬编码。

我尝试按照 Unpivot 表和计算字段中的代码进行操作,但它给了我相同的结果。

任何帮助都是值得赞赏的。

提前致谢。

P. S. - 我正在使用 Azure Synapse 数据仓库 SQL。

SQL Azure-Synapse 取消 Pivot 交叉应用

评论


答:

1赞 Adrian Maxwell 11/11/2023 #1

对于不同的 dbms,下面有 2 种变体:


对于 SQL Server(因为问题最初被标记)

还有另一种方法可以在 SQL Server 中使用 和 “取消透视”,这将为值中的每个条目生成一行,您可以根据需要输出任意数量的列。我喜欢按照下面看到的方式布局值,因为它几乎模仿了结果的样子:cross applyvalues

SELECT
       SourceFileInsertDateTime AS Forecast_Release_Date
     , CrossApplied.*
FROM MyTable
CROSS APPLY (
    VALUES 
            (Adj_Fcst_1, dateadd(week,1,SourceFileInsertDateTime))
          , (Adj_Fcst_2, dateadd(week,2,SourceFileInsertDateTime))
          , (Adj_Fcst_3, dateadd(week,3,SourceFileInsertDateTime))
          , (Adj_Fcst_4, dateadd(week,4,SourceFileInsertDateTime))
          , (Adj_Fcst_5, dateadd(week,5,SourceFileInsertDateTime))
          , (Adj_Fcst_6, dateadd(week,6,SourceFileInsertDateTime))
        ) AS CrossApplied(Adjusted_Forecast, Forecast_Release_Week)

此处更全面地解释了该技术,请参阅此答案


Azure Synapse 数据仓库 SQL 中使用

SELECT
    SourceFileInsertDateTime AS Forecast_Release_Date,
    Adjusted_Forecast,
    Forecast_Release_Week
FROM
    (
        SELECT Adj_Fcst_1 AS Adjusted_Forecast, dateadd(week,1,SourceFileInsertDateTime) AS Forecast_Release_Week FROM MyTable
        UNION ALL
        SELECT Adj_Fcst_2, dateadd(week,2,SourceFileInsertDateTime) FROM MyTable
        UNION ALL
        SELECT Adj_Fcst_3, dateadd(week,3,SourceFileInsertDateTime) FROM MyTable
        UNION ALL
        SELECT Adj_Fcst_4, dateadd(week,4,SourceFileInsertDateTime) FROM MyTable
        UNION ALL
        SELECT Adj_Fcst_5, dateadd(week,5,SourceFileInsertDateTime) FROM MyTable
        UNION ALL
        SELECT Adj_Fcst_6, dateadd(week,6,SourceFileInsertDateTime) FROM MyTable
    ) AS T

评论

0赞 Adrian Maxwell 11/11/2023
我更改了答案以包括计算日期。它未经测试,可能需要调整。
0赞 siggemannen 11/11/2023
这看起来不错,但我可能只是将:1、2、3、4 留在 Forecast_Release_Week 列中,并在 VALUES 之外执行 DATEADD(week, Forecast_Release_Week, SourceFileInsertDateTime)。避免重复函数调用
0赞 Adrian Maxwell 11/12/2023
要求是使计算是动态的。据推测,行与行不同,因此其他日期也会移动。SourceFileInsertDateTime
1赞 Adrian Maxwell 11/13/2023
那为什么要标记为“sql-server”呢?这也影响了日期的计算方式 - 告诉我们您运行 SQL 的正确环境非常重要......它显然也会影响您,因为现在需要更长的时间才能获得解决方案。
1赞 Adrian Maxwell 11/13/2023
不要包含不相关的标签(即 sql server 如何相关),这只会导致混淆和不必要的延迟,因为来回确定哪个 DBMS 适用。在以后的问题中也请注意这一点。