如何解决客户端内存不足且 row_number 不递增的 VIEW (MariaDB) 中的 CTE 问题?

How to correct issues with CTE in VIEW (MariaDB) where client runs out of memory and row_number does not increment?

我正在尝试制作一个显示 10 分钟移动平均线的视图,其中移动平均线字段 returns 前 10 分钟数据的 NULL 值。

我遇到的问题是:
1. 命令行和 HeidiSQL 客户端 运行 内存不足(他们没有用完我的系统内存,这一定是软件限制)。
2. 当我放入 LIMIT 子句时,查询 运行s 但值没有正确递增(即行号始终为 1,date/time 始终是第一个 date/time table,等等)。

Table 有 604,800 行和 2 列。

系统规格为:

Processor Intel(R) Core(TM) i5-3570K CPU @ 3.40GHz, 3401 Mhz, 4 Core(s), 4 Logical Processor(s) (OC to 4.4 GHz) Installed Physical Memory (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" "5.370000"  
"2" "2018-08-23 00:00:02" "5.36" "5.365000"  
"3" "2018-08-23 00:00:03" "5.37" "5.366667"  
"4" "2018-08-23 00:00:04" "5.34" "5.360000"  
"5" "2018-08-23 00:00:05" "5.01" "5.290000"  
"6" "2018-08-23 00:00:06" "5.00" "5.241667"  
"7" "2018-08-23 00:00:07" "5.35" "5.257143"  
"8" "2018-08-23 00:00:08" "5.73" "5.316250"  
"9" "2018-08-23 00:00:09" "5.37" "5.322222"  
"10" "2018-08-23 00:00:10" "5.35" "5.325000"  

但是我得到的是:

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 语句以包括 JOINS,它修复了日期时间和风速列,但仍然无法让 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;

您的第一次尝试,使用没有任何 WHERE 的所有 SQL92 之前的语法连接,将 return 604800^3 行。第二个左连接将只产生 604800^2 行(因为第二个连接的 ON 不使用被连接的 table,每一行都会被使用)。但是似乎没有任何自连接的意义 - 你可以在没有任何的情况下获得你想要的计算。