因此,以下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中时,我不确定如何进行更改或创建列。
任何帮助赞赏!我对这个东西真的很新,所以它可能是我失踪的小事(愚蠢)。先感谢您!
-- 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]
您需要先更改表,然后将选择作为更新运行,并加入字段键。
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