Как мне сохранить «представление» как постоянную таблицу в mySQL? - PullRequest
0 голосов
/ 23 января 2019

Я новичок в SQL и все еще учусь.

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

Мой код выглядит примерно так:

select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
from table1;  -- this is my view

тогда я бы хотел table1 или новую таблицу для хранения этого представления (столбцы дата, цена закрытия, 20 дней ма )

в основном,
Старый стол: дата, цена закрытия

Новая таблица: дата, цена закрытия, 20_day_ma

Возможно, проще просто добавить новый столбец 20_day_ma , но я не знаю, как добавить новые значения, которые зависят от других столбцов.

редактирование:

Так что просто попробовал это:

DELIMITER $$
-- create table1
drop table if exists table1;

create table table1 as
select STR_TO_DATE(`Date`, '%d-%M-%Y') as `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) as 
'20 Day MA'
from source_table $$

DELIMITER ;

И я постоянно получаю сообщение об ошибке: Команды не синхронизированы

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Создать новую таблицу из набора результатов просто. CREATE ... SELECT - это способ .

 CREATE my_new_table AS
 SELECT whatever FROM sometable;

Необходимо указать действительное имя столбца (псевдоним) для каждого столбца в выбранном вами.

Pro tip: Не создавайте таблицы, где будут отображаться представления.Когда вы используете представление, оно получает самые последние и самые лучшие данные из базовых таблиц каждый раз, когда вы его используете.Но когда вы создаете таблицу, это моментальный снимок.

Совет профессионала: Профессора не профессионалы, поэтому они могут дать вам упражнения для выполнения, которые являются плохими идеями в реальном мире.

0 голосов
/ 23 января 2019

У вас есть следующие варианты:

  • Просмотр: данные не сохраняются; при каждом запросе выполняется запрос к исходным таблицам

  • «Материализованное представление»: в MySQL такой конструкции нет, но вы можете эмулировать ее с помощью триггеров в исходных таблицах. Если строка создана, обновлена ​​или удалена, вы можете обновить материализованное представление. Попробуйте найти это, есть хорошие описания об этом. Полезно, если исходные таблицы редко обновляются. Может быть немного сложно, если ваш select сложный.

  • Временная таблица: CREATE TEMPORARY TABLE t1 (...); и INSERT INTO t1 SELECT (your query); (может быть сокращена до CREATE TEMPORARY TABLE t1 AS SELECT (your query)). Эти таблицы создают снимок текущего состояния и живут до тех пор, пока ваше соединение живет (даже через транзакции), но не могут быть разделены между соединениями. Вы можете добавить индексы и т. Д., Чтобы ускорить запросы. Это полезно, если у вас есть сложный процесс, который должен хранить данные, которые обрабатываются в процессе несколько раз.

  • Создайте столбец для хранения значений и создайте MySQL EVENT для его регулярного обновления.

ИМХО, поскольку скользящее среднее за 20 дней должно обновляться ежедневно, последнее решение является лучшим. Если вы не доверяете MySQL или у вас есть другой планировщик заданий, вы можете также вызывать оператор SQL для обновления.

0 голосов
/ 23 января 2019

Вы можете сделать 3 вещи: 1> создать представление (вы будете ссылаться на представление, как если бы оно было таблицей)

create view my_new_view as
select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
from table1; 

, затем прочитать данные с помощью select * from myview

Если вам нужен «снимок» таблицы, вы можете «материализовать» с помощью select into

CREATE TABLE my_new_table -- mysql syntax
select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
-- into my_new_table --this forces the creation of new table -- sorry: SQL SERVER syntax
from table1

Третий вариант - добавить новый столбец, чем вызывать «обновление», чтобы заполнить его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...