我对SQL是相对较新的,并且试图弄清为什么我会在帖子标题中遇到错误。(我认为这与滞后功能有关吗?(
这是我要执行的代码:
ALTER TABLE [MyDatabase].[dbo].[MyTable]
ADD Calc_Column AS CAST
(
CASE WHEN [Variable_X] = LAG([Variable_X],1,0) OVER (Order By FileDate)
AND [Variable_Y] != LAG([Variable_Y],1,0) OVER (Order By FileDate)
AND [ACTUAL START DATE] != 0
AND [FileDate] >= [ACTUAL START DATE]
THEN 1
ELSE 0
END AS N
)
GO
错误消息非常清楚:您可以使用窗口函数(lag
(,在这种情况下,其他任何其他 select
子句或order by
子句。
一个计算的列只能参考函数或当前行中的值,它不能直接在其声明中进行选择。
但是可以使用用户定义的标量函数来计算它,因此,如果您确实想使用窗口函数计算的计算列,则必须使用用户定义的函数进行操作。我试图为您制作示例功能,但是由于您没有共享表的DDL,因此我必须做出假设和猜测,而我无法测试它 - 因此它可能不完全适合。但是,它应该足以展示总体想法,并且您应该能够根据您的需求进行修改。
CREATE FUNCTION dbo.CalculateMyColumn
(
-- Assuming an int identity column with ascending order
@PrimaryKeyColumn int
)
Returns Bit
AS
BEGIN
DECLARE @ReturnValue bit
;WITH cte AS
(
SELECT Variable_X,
LAG([Variable_X],1,0) OVER (Order By FileDate) As Prev_Variable_X,
Variable_Y,
LAG([Variable_Y],1,0) OVER (Order By FileDate) As Prev_Variable_Y,
[ACTUAL START DATE],
[FileDate],
PrimaryKeyColumn
FROM TableName
WHERE PrimaryKeyColumn <= @PrimaryKeyColumn
)
SELECT @ReturnValue =
CASE WHEN Variable_X = Prev_Variable_X
AND Variable_Y != Prev_Variable_Y
AND [ACTUAL START DATE] != 0
AND [FileDate] >= [ACTUAL START DATE]
THEN 1
ELSE 0
END
FROM cte
WHERE PrimaryKeyColumn = @PrimaryKeyColumn
END
然后您可以更改表格添加计算的列:
ALTER TABLE [MyDatabase].[dbo].[MyTable]
ADD Calc_Column AS dbo.CalculateMyColumn(PrimaryKeyColumn)
GO
请注意,此功能依赖于主键列是带有上升顺序的int Identity列。