实例声明中的SQL滞后

Gav*_*vin -1 sql oracle lag window-functions

如果当前CLUSTERn =上一个CLUSTERn,然后将上一个PRODCAT作为PREVCAT添加到当前行,那么我的case语句出了什么问题,我将不胜感激。

ORA-30484: missing window specification for this function
30484. 00000 -  "missing window specification for this function"
*Cause:    All window functions should be followed by window specification,
           like <function>(<argument list>) OVER (<window specification>)
*Action:
Error at Line: 11 Column: 30
Run Code Online (Sandbox Code Playgroud)
SELECT  CLUSTERn,
        MEMBERn,
        COUNT(*) OVER ( PARTITION BY CLUSTERn ORDER BY MEMBERn, PRODCAT, STARTd, ENDd ) AS NEWRANK,
        CASE WHEN CLUSTERn = LAG(CLUSTERn) THEN LAG(PRODCAT) ELSE 'New' END AS PREVCAT,
        STATUS,
        PRODCAT,
        JOINTYPE,
        JOINRANK,
        CSP,
        PROGID,
        PROMNAME,
        PROMOID,
        COHORT,
        FWEEK,  
        STARTd,
        ENDd,
        SOURCE
FROM(
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

我不确定是什么令人困惑。你有:

(CASE WHEN CLUSTERn = LAG(CLUSTERn)
      THEN LAG(PRODCAT)
      ELSE 'New'
 END) AS PREVCAT,
Run Code Online (Sandbox Code Playgroud)

您缺少该OVER子句-所有窗口函数的基本内容。

没有样本数据,很难确定您真正想要的是什么。也许:

(CASE WHEN CLUSTERn = LAG(CLUSTERn) OVER (ORDER BY MEMBERn, PRODCAT, STARTd, ENDd)
      THEN LAG(PRODCAT) OVER (ORDER BY MEMBERn, PRODCAT, STARTd, ENDd)
      ELSE 'New'
 END) AS PREVCAT,
Run Code Online (Sandbox Code Playgroud)

也有可能CASE不需要。 LAG()具有三个参数的形式,可让您指定默认值:

LAG(PRODCAT, 1, 'NEW') OVER (PARTITION BY ClusterN ORDER BY STARTd, ENDd)
Run Code Online (Sandbox Code Playgroud)