Sql 当客户端内存不足且行数不增加时,如何纠正视图中CTE(MariaDB)的问题?
我试图创建一个显示10分钟移动平均值的视图,其中移动平均值字段为前10分钟的数据返回空值 我遇到的问题是: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个逻辑处
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;