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":无效的标识符错误。我需要一个别名来将结果插入到新表中。
答案 0 :(得分: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);
答案 1 :(得分: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;