在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;