我想通过对 12 个连续值进行平均,将我的数据库(现在包含大量值)压缩到原始大小的 1/12。
为此,我使用类型
TIMESTAMP
和 FLOAT(4,2)
形成平均值。为了正确地平均 TIMESTAMP
,我首先想将 TIMESTAMP
转换为 INT
,然后用 AVG()
计算平均值,最后将平均值转换回 DATETIME
。然而,在此操作过程中,我遇到了无法解释的语法错误。
这是我尝试过的相应查询:
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
我尝试了许多不同版本的 CAST 指令,但都没有产生所需的结果。语法上唯一正确的 CAST 语句是当我将 AVG() 值转换回原始数据类型时。
当前表的结构如下: 时间作为 TIMESTAMP 当前为 FLOAT(4,2) id 为 INT 自动增量
表 condensed_12_current 具有以下结构: 时间作为 TIMESTAMP 当前为 FLOAT(4,2)
适用于 x86_64 上 Linux 的 MYSQL 版本 8.2.0(MySQL 社区服务器 - GPL)
您必须先告诉 SQL Server 如何对行进行排序,然后才能告诉它选择前面的行。例如,要按
ID
列对行进行排序:
AVG(current) OVER (
ORDER BY ID ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
) AS current_mean