【问题标题】:Not able to use LAG function in defining computed column in SQL Server 2014在 SQL Server 2014 中定义计算列时无法使用 LAG 函数
【发布时间】:2017-06-27 18:56:15
【问题描述】:

我正在尝试创建我想要计算列的表,该列将具有来自同一个表的前一行的列值。但我无法成功使用 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 编码的新手。

提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2014 calculated-columns lag


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 感谢 Gordon,更改逻辑以从视图而不是表中获取值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2019-04-29
    • 2022-01-18
    相关资源
    最近更新 更多