Как исправить проблемы с CTE в VIEW (MariaDB), когда клиенту не хватает памяти и row_number не увеличивается? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь создать представление, показывающее 10-минутную скользящую среднюю, где поле скользящей средней возвращает значение NULL для первых 10 минут данных.

Проблемы, с которыми я сталкиваюсь:
1. Как командной строке, так и клиентам HeidiSQL не хватает памяти (они не исчерпывают мою системную память, это должно быть программным ограничением).
2. Когда я добавляю предложение LIMIT, запрос выполняется, нозначения не увеличиваются правильно (т. е. номер строки всегда равен 1, дата / время всегда являются первой датой / временем в таблице и т. д.).

В таблице 604 800 строк и 2 столбца.

Системные характеристики:

Процессор Intel® Core ™ (TM) i5-3570K CPU @ 3,40 ГГц, 3401 МГц, 4 ядра (-ей), 4 логических процессора (-ов)4,4 ГГц) Установленная физическая память (ОЗУ) 16,0 ГБ

Оператор 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 - правильный результат для этих данных.

Кто-нибудь знает, как я могу решить эти проблемы?

ОБНОВЛЕНИЕ: Согласно комментарию Гордонса, я обновил последние операторы FROM, добавив в них JOINS, которые фиксировали столбцы даты-времени и скорости ветра, но все еще могут 'доберись до работы.

    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

1 Ответ

1 голос
/ 11 июня 2019

Если я не пропустил что-то очевидное, разве вы не должны просто использовать что-то вроде:

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 второго объединения не использует объединяемую таблицу, будет использоваться каждая строка).Но, похоже, нет никакого смысла в том, чтобы присоединиться к этому самому - вы можете получить нужные расчеты безо всяких.

...