【问题标题】:Missing window specification for this function此函数缺少窗口规范
【发布时间】:2014-07-22 01:21:55
【问题描述】:

现在出现以下错误:

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: 17 Column: 72

更新的代码(根据 Aaron Hall 的建议)

select meter_id,
to_char(interval_time_local,'dd-mon-yyyy hh24:mi') as gap_start,
to_char(next_interval_time_local,'dd-mon-yyyy hh24:mi') as gap_finish
from (
                select i1.device_id as meter_id
                          ,interval_time_local
                          ,SUM(CASE i1.chan_num WHEN 0 THEN i1.chan_value * 2 ELSE 0 END) as chan0
                          ,SUM(CASE i1.chan_num WHEN 2 THEN i1.chan_value * 2 ELSE 0 END) as chan1
                          ,SUM(CASE i1.chan_num WHEN 1 THEN i1.chan_value * 2 ELSE 0 END) as chan2
                          ,SUM(CASE i1.chan_num WHEN 3 THEN i1.chan_value * 2 ELSE 0 END) as chan3
                          ,lead(interval_time_local,1) over (order by device_id, interval_time_local) as next_interval_time_local
                from gn_owner_demo.ami_read_interval i1
                where created_utc = ( select max(created_utc)
                                                                from gn_owner_demo.ami_read_interval i2
                                                                where i2.device_id = i1.device_id
                                                                and i2.interval_time_local = i1.interval_time_local)
                group by device_id, interval_time_local, i1.device_id, lead(interval_time_local,1)
                order by device_id, interval_time_local
                )
where interval_time_local <> next_interval_time_local - 30/1440;

我继承了一些提取数据间隙的代码。我从未使用过 OVER 子句,因此不确定它是否正确使用。错误信息是:

ORA-00923: FROM keyword not found where expected
00923. 00000 -  "FROM keyword not found where expected"
*Cause:    
*Action:
Error at Line: 11 Column: 134

这是查询 - 我在 SQL 开发人员中运行:

select meter_id
,to_char(gn_owner_demo.interval_time_local,'dd-mon-yyyy hh24:mi') as gap_start
,to_char(gn_owner_demo.next_interval_time_local,'dd-mon-yyyy hh24:mi') as gap_finish
from (
select i1.device_id as meter_id
    ,interval_time_local
    ,SUM(CASE i1.chan_num WHEN 0 THEN i1.chan_value * 2 ELSE 0 END) as chan0
    ,SUM(CASE i1.chan_num WHEN 2 THEN i1.chan_value * 2 ELSE 0 END) as chan1
    ,SUM(CASE i1.chan_num WHEN 1 THEN i1.chan_value * 2 ELSE 0 END) as chan2
    ,SUM(CASE i1.chan_num WHEN 3 THEN i1.chan_value * 2 ELSE 0 END) as chan3
    ,lead(gn_owner_demo.interval_time_local,1) over (order by gn_owner_demo.device_id, gn_owner_demo.interval_time_local) gn_owner_demo.next_interval_time_local
from gn_owner_demo.ami_read_interval i1
where gn_owner_demo.created_utc = ( select max(gn_owner_demo.created_utc)
            from gn_owner_demo.ami_read_interval i2
            where i2.device_id = i1.device_id
            and i2.interval_time_local = i1.interval_time_local)
group by gn_owner_demo.device_id, gn_owner_demo.interval_time_local
order by gn_owner_demo.device_id, gn_owner_demo.interval_time_local
)
where gn_owner_demo.interval_time_local <> gn_owner_demo.next_interval_time_local - 30/1440;

【问题讨论】:

    标签: sql oracle window-functions analytic-functions over-clause


    【解决方案1】:

    gn_owner_demo.interval_time_local 是什么?

    您的from 子句引用了gn_owner_demo.ami_read_interval,所以我假设gn_owner_demo 是模式名称,ami_read_interval 是表的名称。但是,如果这是正确的,这意味着gn_owner_demo.interval_time_local 指的是一个单独的表,interval_time_local 也归gn_owner_demo 所有。如果这实际上是一个单独的表,则您需要加入该表。不过,我的猜测是,您确实想引用 gn_owner_demo.interval_time_local 表中的 interval_time_local 列,并且这适用于您以这种方式引用的其他列,在这种情况下您将使用 il 别名,即

    lead( il.interval_time_local, 1 )
       over( order by il.device_id,
                      il.interval_time_local) as next_interval_time_local
    

    现在,我怀疑您真的想要 partition by il.device_id 而不是将其放在 order by 中,但是由于您没有告诉我们您的数据是什么样的或您想要的结果是什么,这只是我的猜测。

    如果我的猜测是正确的,您还需要以类似的方式更改 WHEREGROUP BYORDER BY 子句,以便您从正在查询的表中引用列名,而不是比表别名。

    【讨论】:

    • 嗨 - 感谢您的快速回复......这是一个错误......已收到来自查询所有者的更新查询 - 您是对的,架构是“gn_owner_demo”。 interval_time_local 是 ami_read_interval 表中的一列,因此不应出现在查询中。
    • 我应该添加...数据按设备保存数据,查询旨在识别数据中的任何差距。例如,从设备激活之日到退役之日,每台设备每天应该有 48 行数据。该查询旨在识别少于 48 行数据和/或一整天的数据丢失的任何点。然后它应该报告设备 X 具有 1/5/14 #4 的数据,但随后的数据不是 1/5/14 #5,而是说 15/5/14 #10。这有帮助吗?
    • 已删除错误的架构标识符并尝试运行:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2015-11-29
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多