如何解决客户端内存不足且 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,每一行都会被使用)。但是似乎没有任何自连接的意义 - 你可以在没有任何的情况下获得你想要的计算。
我正在尝试制作一个显示 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,每一行都会被使用)。但是似乎没有任何自连接的意义 - 你可以在没有任何的情况下获得你想要的计算。