无法在 SQL Server 2014 中定义计算列时使用 LAG 函数

Not able to use LAG function in defining computed column in SQL Server 2014

我正在尝试创建 table,其中我想要计算列,该列将具有来自同一 table 的前一行的列值。但是我无法成功使用 LAG 功能。

CREATE TABLE DYL(
    DY_DT DATE NOT NULL,
    DY_SEN_NME varchar(20) NOT NULL,
    DY_OEN_PRC numeric(14,2) NOT NULL,
    DY_HEL_PRC numeric(14,2) NOT NULL,
    DY_LEL_PRC numeric(14,2) NOT NULL,
    DY_CLN_PRC numeric(14,2) NOT NULL,
    DY_REG AS (DY_HEL_PRC - DY_LEL_PRC) PERSISTED,
    DY_PRV_PRC AS LAG(DY_CLN_PRC,1,0) OVER (PARTITION BY DY_SEN_NME ORDER BY DT)
)

我收到错误 Windows 函数只能出现在 SELECT 或 ORDER BY 子句中。

如果这不可能,那么如何使用函数来实现。我尝试编写一个标量函数并将其关联到 DY_PRV_PRC。

ALTER TABLE DYL 
    ADD DY_PRV_PRC AS F_PRV_PRC()

但这在 DY_PRV_PRC 中给了我相同的值,而不是给了 DY_CLN_PRC

列的前一行值

下面是函数 F_PRV_PRC:

的代码
CREATE FUNCTION [dbo].[F_PRV_PRC] ()
RETURNS NUMERIC(14,2)
AS
BEGIN

    DECLARE @pcp NUMERIC(14,2)
    SELECT @pcp = LAG(DY_CLN_PRC,1,0) OVER (PARTITION BY DY_SEN_NME ORDER BY DY_DT)
    FROM DYL;
    RETURN @pcp;

END;

如果可能,请建议更改函数,以便它可以给出前一行的列值。非常抱歉,因为我是 SQL 编码的新手。

非常感谢

这真的不是一件好事(从性能的角度来看)。但是,如果您想这样做,请从用户值函数开始:

DY_PRV_PRC AS (get_prev_value(DY_CLN_PRC, DY_SEN_NME, DT))

然后像这样定义函数:

CREATE FUNCTION dbo.get_prev_value (
    @DY_CLN_PRC numeric(14,2)
    @DY_SEN_NME varchar(20)
    @DT date
)
RETURNS NUMERIC(14,2)
AS
BEGIN
    DECLARE @pcp NUMERIC(14,2)
    SELECT @pcp = (SELECT TOP 1 DY_CLN_PRC
                   FROM DYL
                   WHERE DY_SEN_NME = @DY_SEN_NME
                         DY_DT < @DY_DT
                   ORDER BY DY_DT DESC
                  );
    RETURN @pcp;
END;

如果你想使用 LAG() 使用视图:

create view v_dyl as
    select dyl.*,
           lag(DY_CLN_PRC) over (partition by DY_SEN_NME order by DT) as prev_dy_cln_prc
    from dyl;