【问题标题】:Error when using analytic function. I can not find the reason使用解析函数时出错。我找不到原因
【发布时间】:2020-08-31 13:33:01
【问题描述】:

这个查询有什么错误?

    select department_id, first_name,
lag(first_name) over (partition by department_id order by salary rows between 1 preceding and 2 following), 
lead(first_name) over (partition by department_id order by salary rows between 1 preceding and 2 following) 
from employees order by department_id;

错误是:

ORA-00907: missing right parenthesis

但是括号没问题。这里有什么问题?

【问题讨论】:

    标签: sql oracle select window-functions analytic-functions


    【解决方案1】:

    lag()lead() 不接受窗口子句(rows between 部分)。他们所做的是查看“上一个”和“下一个”行,因此,如果您考虑一下,从功能的角度来看,窗框是没有意义的。

    来自the documentation - 强调我的:

    一些分析函数允许windowing_clause。在本节末尾的分析函数列表中,允许 windowing_clause 的函数后跟一个星号 (*)。

    在文档的更下方,lag()lead() 列出时不带星号(与 avg()count() 不同。

    大概,你只是想要:

    select 
        department_id, 
        first_name,
        lag(first_name)  over (partition by department_id order by salary) lag_first_name, 
        lead(first_name) over (partition by department_id order by salary) lead_first_name
    from employees 
    order by department_id;
    

    请注意,您可以通过将第二个参数传递给函数(未指定时默认为 1)来抵消 lead()lag(),例如:

        lead(first_name, 3)  -- get the "third" following first name
            over (partition by department_id order by salary) lag_first_name
    

    【讨论】:

    • 谢谢。但我不需要选择第二个名字,我需要当前名字之后的第三个名字。我不能这样做吗?
    • @LOP。 . .我建议您提出一个 问题,其中包含示例数据、所需结果以及您想要做什么的解释。这回答了您在此处提出的问题。
    • @LOP:您可以将第二个参数传递给lead()lag() - 请参阅我的编辑。要获得更准确的答案,您确实需要提出另一个问题,正如 Gordon Linoff 所解释的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多