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]
因此,以下 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]