案例陈述中的 SQL 滞后

Posted

技术标签:

【中文标题】案例陈述中的 SQL 滞后【英文标题】:SQL LAG IN CASE STATEMENT 【发布时间】:2018-06-22 09:40:27 【问题描述】:

如果 Current CLUSTERn = Previous CLUSTERn 然后将 Previous PRODCAT 作为 PREVCAT 添加到当前行...

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
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(

【问题讨论】:

您的查询非常不完整。您可以更好地判断您的查询出了什么问题。有了更多信息,我们将能够更好地为您提供帮助(如果有错误消息,输入/输出(预期和实际)等) Case &gt;&gt; When &gt;&gt; Then&gt;&gt; Else&gt;&gt; End 对于初学者:CLUSTERn = LAG(CLUSTERn) = LAG(PRODCAT) 是错误的,你不能“附加”这样的相等条件(无论你在哪里使用它们) “缺少窗口规范”有什么不清楚的地方? @Gavin LAG 是一个分析函数,因此您需要为其提供窗口规范,就像您在上一行中使用的分析版本的 COUNT 一样。如果您对分析函数不清楚,我强烈建议您阅读它们。在您的情况下,只有您知道“上一行”的定义(因为您没有告诉我们那一点逻辑);这就是需要进入(当前缺失的)OVER () 子句以告诉 Oracle 如何选择上一行的内容。 【参考方案1】:

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

(CASE WHEN CLUSTERn = LAG(CLUSTERn)
      THEN LAG(PRODCAT)
      ELSE 'New'
 END) AS PREVCAT,

您缺少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,

也可能不需要CASELAG() 有一个三参数形式,允许您指定默认值:

LAG(PRODCAT, 1, 'NEW') OVER (PARTITION BY ClusterN ORDER BY STARTd, ENDd)

【讨论】:

以上是关于案例陈述中的 SQL 滞后的主要内容,如果未能解决你的问题,请参考以下文章

结合案例陈述[重复]

SQL 中的案例语句 - 过程的性质

案例表达与案例陈述

将案例逻辑构建到 SQL 中的最佳方法

Ruby中的案例陈述[重复]

Verilog 中的案例陈述?