SQL:CAST与窗口函数结合导致语法错误

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

我想通过对 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 casting syntax-error window-functions
1个回答
0
投票

您必须先告诉 SQL Server 如何对行进行排序,然后才能告诉它选择前面的行。例如,要按

ID
列对行进行排序:

AVG(current) OVER (
    ORDER BY ID ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
    ) AS current_mean
© www.soinside.com 2019 - 2024. All rights reserved.