案例陈述中的 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 >> When >> Then>> Else>> 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,
也可能不需要CASE
。 LAG()
有一个三参数形式,允许您指定默认值:
LAG(PRODCAT, 1, 'NEW') OVER (PARTITION BY ClusterN ORDER BY STARTd, ENDd)
【讨论】:
以上是关于案例陈述中的 SQL 滞后的主要内容,如果未能解决你的问题,请参考以下文章