SQL将Windows函数添加为新列

问题描述 投票:0回答:2

因此,以下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中时,我不确定如何进行更改或创建列。

任何帮助赞赏!我对这个东西真的很新,所以它可能是我失踪的小事(愚蠢)。先感谢您!

sql sql-server tsql calculated-columns
2个回答
1
投票
-- 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]

2
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.