我想通过对12个连续值取平均值,将现在包含大量值的数据库压缩到原始大小的1/12.

为此,我使用类型TIMESTAMPFLOAT(4,2)来形成平均值.为了正确地计算TIMESTAMP的平均值,我首先想将TIMESTAMP转换为INT,然后用AVG() 计算平均值,最后将平均值转换回DATETIME.然而,在此操作过程中,我收到了一个我无法解释的语法错误.

这是我try 过的各自的查询:

INSERT INTO condensed_12_current(time_mean, current_mean)
SELECT
  CAST(AVG(CAST(time as INTEGER)) AS DATETIME) OVER (
    ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
  ) AS time_mean,
  AVG(current) OVER (
    ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
  ) AS current_mean
FROM current
WHERE id % 12 = 0;

导致的错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER)) AS DATETIME) OVER (
    ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
  ' at line 3

我try 了许多不同版本的CAST指令,但都没有产生预期的效果.语法上唯一正确的CAST语句是当我将AVG()值转换回原始数据类型时.

表电流具有以下 struct : 时间作为时间戳 当前为浮点数(4,2) ID为整型自动递增

表CONDESED_12_CURRENT具有以下 struct : 时间作为时间戳 当前为浮点数(4,2)

用于x86_64上的Linux的MySQL Ver 8.2.0(MySQL社区服务器-GPL)

推荐答案

您应该告诉数据库如何对行进行排序,否则它将以任意顺序处理它们.例如,要按ID列对行进行排序:

avg(current) over (
    order by id rows between 11 preceding and current row
    ) as current_mean

Example at DB Fiddle

MySQL似乎不支持将timestamp转换为integer.您可以改用from_unixtime()unix_timestamp():

from_unixtime(avg(unix_timestamp(ts)) over
            (rows between 1 preceding and current row))

Example at DB Fiddle

Mysql相关问答推荐

过程/别名是有点长的MySQL命令的一部分吗?

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

优化使用ORDER BY加载耗时较长的MySQL请求

MySQL添加表会将&@@&qot;追加到表名

比较2个mysql json数据类型列

从表中 Select 具有不同顺序的列

MySQL 搜索列字段字符串

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

如何在 axios 请求中将更新的设置状态值作为参数传递

为什么order by子句可以利用索引?

获取 MySQL 中每一行之间负差的总和

在 Codeigniter MySQL 中从另一个数据库获取数据

组平SQL查询结果

是否可以在一个查询中将字符串附加到许多匹配的行

如何根据特定条件从mysql数据库中 Select 查询

如何过滤表格,以便它显示最新的数据?

不是唯一的表/别名

如何在特定数据库中创建表?

MySQL - 表'my_table'没有被锁定表锁定

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?