【问题标题】:Invalid identifier with CAST带有 CAST 的无效标识符
【发布时间】:2018-02-08 20:37:36
【问题描述】:

Oracle DB 12.1.0 中的我的表包含时间戳和值。每 1 秒收集一次值。我只需要保持 1 分钟的平均值。 例如

日期时间值 01.11.2013 0:00:01 10 01.11.2013 0:00:02 20 01.11.2013 0:00:03 10 01.11.2013 0:00:04 20 ... 01.11.2013 0:00:59 10

应该返回

平均 01.11.2013 0:00:00 14,91525424 01.11.2013 0:01:00 ...

我尝试按分钟截断并计算平均值。它可以在没有 dt 别名的情况下工作。

select cast(trunc(datetime,'mi') as timestamp) dt, avg(value) as average
from my_table
group by dt order by dt

但得到 ORA-00904: "DT": invalid identifier 错误。我需要一个别名来将结果插入到新表中。

【问题讨论】:

    标签: sql oracle casting average alias


    【解决方案1】:

    你不能使用别名进行分组,像这样使用:

    select cast(trunc(datetime,'mi') as timestamp) dt, avg(value) as average
    from my_table
    group by cast(trunc(datetime,'mi') as timestamp) 
    order by cast(trunc(datetime,'mi') as timestamp);
    

    【讨论】:

    • 哇,就是这样。错误位置是指第一次提到 dt (cast(trunc(datetime,'mi') as timestamp) dt) 所以我尝试了很多不同的组合,但没有检查你的。十分感谢! Tesekkurler :)
    • @KirillDrozdov pojalusta :)
    【解决方案2】:

    cast 并不是真正的问题;您不能在同一级别的查询中使用列表达式别名,除了在 order-by 子句中。这是因为语句被解析和执行的顺序。 From the docs:

    c_alias

    指定列表达式的别名。 Oracle 数据库将在结果集的列标题中使用此别名。 AS 关键字是可选的。别名在查询期间有效地重命名选择列表项。别名可以在 order_by_clause 中使用,但不能在查询中的其他子句中使用。

    您可以使用子查询,或者在这种情况下只是重复表达式;你甚至不需要包括演员:

    select cast(trunc(datetime,'mi') as timestamp) dt, avg(value) as average
    from my_table
    group by trunc(datetime,'mi')
    order by dt
    /
    

    如果您仍然真的想在 group-by` 子句中使用别名 - 也许您的真实表达式要复杂得多 - 您需要使用内联视图或 CTE:

    select dt, avg(value) as average
    from (
      select cast(trunc(datetime,'mi') as timestamp) dt, value
      from my_table
    )
    group by dt
    order by dt;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多