SQL错误 - Windows函数只能通过子句以选择或订购



我对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列。

最新更新