无法在 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;
我正在尝试创建 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;