时间戳列的每小时平均值 - 在预期位置未找到 FROM 关键字

Hourly average for timestamps columns - FROM keyword not found where expected

我想获得两列的每小时平均值。列的类型是时间戳。

我试试这个:

select trunc(endtime, 'HH') as Date,
    avg(extract(second from intrvl)
        + extract(minute from intrvl) * 60
        + extract(hour from intrvl) * 60 * 60
        + extract(day from intrvl) * 60 * 60 * 24) as average
from (
    select (endtime - starttime) intrvl 
    from mytable
)
group by Date;

我完全不知道这是否是正确的方法。但查询不正确。我收到此错误:00923. 00000 - "FROM keyword not found where expected"

最后我想要一个像这样的table:

Date average
16/11/2021 08:00 5.786
16/11/2021 09:00 8.996

我怎样才能得到这个?

Date 是保留字(对于数据类型),不能将其用作别名,除非将其括在双引号中,如

  SELECT TRUNC (endtime, 'HH') AS "Date",
         AVG (
              EXTRACT (SECOND FROM intrvl)
            + EXTRACT (MINUTE FROM intrvl) * 60
            + EXTRACT (HOUR FROM intrvl) * 60 * 60
            + EXTRACT (DAY FROM intrvl) * 60 * 60 * 24) AS average
    FROM (SELECT (endtime - starttime) intrvl FROM mytable)
GROUP BY "Date";

或者,将其重命名为例如c_date

SELECT TRUNC (endtime, 'HH') AS c_date,

您需要在内部查询的 SELECT 子句中包括要在外部查询中使用的所有列,并且不能在中使用 SELECT 子句的别名同一子查询中的 GROUP BY 子句:

select trunc(endtime, 'HH') as "Date",
       avg(
           extract(second from intrvl)
         + extract(minute from intrvl) * 60
         + extract(hour   from intrvl) * 60 * 60
         + extract(day    from intrvl) * 60 * 60 * 24
       ) as average
from (
  select endtime,
         endtime - starttime AS intrvl 
  from   mytable
)
group by trunc(endtime, 'HH');

如果你没有(或不担心)小数秒那么你也可以使用:

select trunc(endtime, 'HH') as "Date",
       AVG(
         (CAST(endtime AS DATE) - CAST(starttime AS DATE))
         * 60 * 60 * 24
       ) AS average
from   mytable
group by trunc(endtime, 'HH');

db<>fiddle here