Sql 当客户端内存不足且行数不增加时,如何纠正视图中CTE(MariaDB)的问题?

Sql 当客户端内存不足且行数不增加时,如何纠正视图中CTE(MariaDB)的问题?,sql,mariadb,common-table-expression,Sql,Mariadb,Common Table Expression,我试图创建一个显示10分钟移动平均值的视图,其中移动平均值字段为前10分钟的数据返回空值 我遇到的问题是: 1.命令行和HeidiSQL客户端都耗尽了内存(它们没有最大限度地使用我的系统内存,这一定是软件限制)。 2.当我放入LIMIT子句时,查询将运行,但值的增量不正确(即,行号始终为1,日期/时间始终为表中的第一个日期/时间,等等) 表有604800行和2列 系统规格包括: 处理器Intel(R)Core(TM)i5-3570K CPU@3.40GHz,3401 Mhz,4 核心,4个逻辑处

我试图创建一个显示10分钟移动平均值的视图,其中移动平均值字段为前10分钟的数据返回空值

我遇到的问题是:
1.命令行和HeidiSQL客户端都耗尽了内存(它们没有最大限度地使用我的系统内存,这一定是软件限制)。
2.当我放入LIMIT子句时,查询将运行,但值的增量不正确(即,行号始终为1,日期/时间始终为表中的第一个日期/时间,等等)

表有604800行和2列

系统规格包括:

处理器Intel(R)Core(TM)i5-3570K CPU@3.40GHz,3401 Mhz,4 核心,4个逻辑处理器(OC至4.4 GHz)已安装物理 内存(RAM)16.0 GB

SQL语句是:

CREATE VIEW moving_average
AS
WITH cte_rawdata AS
        (SELECT
            date_time, wind_speed
            FROM raw_data),
cte_MA10m AS
        (SELECT
            date_time, wind_speed,
            ROW_NUMBER() OVER(ORDER BY date_time ASC) AS rn,
            AVG(wind_speed) OVER(ORDER BY date_time ASC ROWS BETWEEN 599 PRECEDING AND CURRENT ROW) AS MA10m
            FROM raw_data)
    SELECT
        rn, rd.date_time, rd.wind_speed,
        IF(rn > 599, MA10m, NULL)
        FROM raw_data rd, cte_rawdata, cte_MA10m;
输出应如下所示(加上行号,未显示):

但我得到的却是:

rn   datetime          windspeed MA10m  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
"1" "2018-08-23 00:00:01" "5.37" \N  
注意:\N是此数据的正确结果

有人知道我如何解决这些问题吗

更新:根据Gordon的评论,我更新了最后一个FROM语句以包含连接,它修复了datetime和wind speed列,但仍然无法使rn工作

    FROM
    raw_data AS rd
    LEFT JOIN cte_rawdata ON rd.date_time = cte_rawdata.date_time
    LEFT JOIN cte_MA10m ON rd.date_time = cte_rawdata.date_time

除非我遗漏了一些明显的东西,否则你不应该使用类似以下的东西:

WITH cte_MA10m AS
    (SELECT
        date_time, wind_speed,
        ROW_NUMBER() OVER(ORDER BY date_time ASC) AS rn,
        AVG(wind_speed) OVER(ORDER BY date_time ASC ROWS BETWEEN 599 PRECEDING AND CURRENT ROW) AS MA10m
        FROM raw_data)
SELECT
    rn, date_time, wind_speed,
    IF(rn > 599, MA10m, NULL) AS MA10m
    FROM cte_MA10m
    ORDER BY date_time;

第一次尝试时,如果使用所有SQL92之前的语法联接,而不使用任何
WHERE
,将返回
604800^3
行。具有左联接的第二个联接将只生成
604800^2
行(因为第二个联接的
ON
不使用被联接的表,所以将使用每一行)。但是这种自连接似乎没有任何意义——你可以不用任何东西就得到你想要的计算。

千万不要在
FROM
子句中使用逗号。始终使用正确、明确、标准的
JOIN
语法。适当的
JOIN
条件可能会解决您的问题。好的,谢谢,更新了原始帖子(这似乎不允许代码块)。我是SQL新手,所以我的代码肯定会有最佳实践问题。
在rd.date\u time=cte\u rawdata上左加入cte\u MA10m。date\u time
看起来不正确。加入
raw\u data
cte\u raw\u data
也不正确。乍一看,我不明白什么是真正意义上的自我加入。(或者为什么会有任何连接,实际上)是的,这非常有效!我很欣慰,毕竟这是一个如此简单的问题。这个问题比我写的更有意义。谢谢
WITH cte_MA10m AS
    (SELECT
        date_time, wind_speed,
        ROW_NUMBER() OVER(ORDER BY date_time ASC) AS rn,
        AVG(wind_speed) OVER(ORDER BY date_time ASC ROWS BETWEEN 599 PRECEDING AND CURRENT ROW) AS MA10m
        FROM raw_data)
SELECT
    rn, date_time, wind_speed,
    IF(rn > 599, MA10m, NULL) AS MA10m
    FROM cte_MA10m
    ORDER BY date_time;