SQL 添加 Windows 函数作为新列

SQL Adding Windows Functions as a New Column

因此,以下 Windows 函数用于获取计算列:

USE MfgMetrics 
SELECT
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]),
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] = 
       (
       CASE 
       WHEN [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) THEN 2
       WHEN [ORDER NUMBER]=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate])
             AND [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) 
             AND [Order_Quantity] != LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]) 
             AND [ACTUAL START DATE] != 0 AND [FileDate] >= [ACTUAL START DATE] 
       THEN 1 
       ELSE 0 
       END
       ) 
FROM dbo.Testing_Table_II

但我需要将计算的列添加到 Testing_Table_II,当我尝试这样做时:

USE MfgMetrics 
ALTER TABLE dbo.Testing_Table_II
SELECT
ADD [Calc_ORDER_NUMBER_LAG] AS LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]),
ADD [Calc_Order_Quantity_LAG] AS LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]),
ADD [Calc_Qty_Changed] AS
       (
       CASE 
       WHEN [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) THEN 2
       WHEN [ORDER NUMBER]=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate])
             AND [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) 
             AND [Order_Quantity] != LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]) 
             AND [ACTUAL START DATE] != 0 AND [FileDate] >= [ACTUAL START DATE] 
       THEN 1 
       ELSE 0 
       END
       ) 
FROM dbo.Testing_Table_II

它不起作用...当 Windows 函数必须在 SELECT FROM 中时,我不确定如何更改或创建列。

感谢任何帮助!我对这些东西真的很陌生,所以它可能是我遗漏的一些小东西(愚蠢的)。提前致谢!

您需要先更改 table 然后 运行 您的选择作为更新,加入字段键。

ALTER Testing_Table_II ADD 
    Calc_ORDER_NUMBER_LAG AS INT,
    Calc_Order_Quantity_LAG AS INT,
    Calc_Qty_Changed AS INT

GO

UPDATE
    TT
SET
    TT.Calc_ORDER_NUMBER_LAG= TT2.Calc_ORDER_NUMBER_LAG,
    TT.Calc_Order_Quantity_LAG= TT2.Calc_Order_Quantity_LAG
   ...
FROM
    Testing_Table_II AS TT
    INNER JOIN 
    (
       <PASTE YOUR FIRST QUERY HERE>
    ) 
    AS TT2 ON TT.PrimaryKey = TT2.PrimaryKey
-- Add the new columns first
ALTER TABLE dbo.Testing_Table_II ADD Calc_ORDER_NUMBER_LAG INT
ALTER TABLE dbo.Testing_Table_II ADD Calc_Order_Quantity_LAG INT
ALTER TABLE dbo.Testing_Table_II ADD Calc_Qty_Changed INT

-- The GO statement (with SSMS) will make the client execute the script as a separate batch
-- So the following UPDATE statement won't fail due to missing table columns
GO 


-- Update the new columns
;WITH NewColumnsValues AS
(
    SELECT
        -- Need to SELECT the primary key values (or any column combination that may work as key)
        [ORDER NUMBER],
        [FileDate],

        [Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]),
        [Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]),
        [Calc_Qty_Changed] = CASE 
            WHEN [ORDER NUMBER] != LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) 
                THEN 2
            WHEN [ORDER NUMBER] = LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate])
                AND [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) 
                AND [Order_Quantity] != LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]) 
                AND [ACTUAL START DATE] != 0 AND [FileDate] >= [ACTUAL START DATE] 
                THEN 1 
            ELSE 0 END
    FROM 
        dbo.Testing_Table_II
)
UPDATE T SET
    Calc_ORDER_NUMBER_LAG = N.Calc_ORDER_NUMBER_LAG,
    Calc_Order_Quantity_LAG = N.Calc_Order_Quantity_LAG,
    Calc_Qty_Changed = N.Calc_Qty_Changed
FROM
    dbo.Testing_Table_II AS T
    INNER JOIN NewColumnsValues AS N ON -- This join has to be by the table's key
        T.[ORDER NUMBER] = N.[ORDER NUMBER] AND 
        T.[FileDate] = N.[FileDate]