CAST标识符无效

问题描述 投票:0回答:2

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

datetime    value
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

应该回来

dt  average
01.11.2013 0:00:00  14,91525424
01.11.2013 0:01:00  ...

我尝试按分钟截断并计算平均值。它没有别名。

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

但得到ORA-00904:“DT”:无效的标识符错误。我需要一个别名来将结果插入到新表中。

sql oracle casting average alias
2个回答
0
投票

您不能使用别名进行分组,使用如下:

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);

0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.