2017-06-27 7 views
0

同じテーブルの前の行の列値を持つ計算列が必要なテーブルを作成しようとしています。しかし、私はLAG関数をうまく使うことができません。SQL Serverの計算列を定義する際にLAG関数を使用できません2014

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のコーディングに慣れていないので、すみません。

多くのありがとうございました

答えて

0

これは(パフォーマンスの観点から)実際には良いことではありません。

:あなたは LAG()ビューを使用を使用したい場合は

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; 

:あなたはそれをやってみたかった場合でも、ユーザー値関数で始まる:

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

次に、関数にこのような何かを定義します

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; 
+0

ありがとうございましたGordonさん、テーブルの代わりにビューから値を取得するようにロジックを変更しました。 – Yenge

関連する問題