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

在SQL Server 2014中定义计算列时无法使用LAG函数,sql,sql-server,sql-server-2014,calculated-columns,lag,Sql,Sql Server,Sql Server 2014,Calculated Columns,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, D

我正在尝试创建一个表,其中我希望计算列具有来自同一表的前一行的列值。但我不能成功地使用滞后函数

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)
)
I get error 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;

感谢Gordon,更改了逻辑以从视图而不是表中获取值。
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;