我是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天_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 ;
我不断收到错误消息:命令不同步
答案 0 :(得分:1)
您可以做三件事: 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
第三个选项是添加新列,而不是调用“更新”来填充
答案 1 :(得分:1)
从结果集中创建新表很简单。 CREATE ... SELECT is the way。
CREATE my_new_table AS
SELECT whatever FROM sometable;
您需要为选择的每一列提供有效的列名(别名)。
专业提示:请勿创建用于提供视图的表格。每次使用视图时,它都会从基础表中获取最新和最大的数据。但是,创建表时,它是及时的快照。
专业提示:教授不是专家,因此他们可能会给您练习以完成现实世界中的坏主意。
答案 2 :(得分:1)
您有以下选择:
视图:不存储数据,每次查询时,都会针对源表运行查询
“材料化视图”:MySQL中没有这样的构造,但是您可以使用源表上的触发器来模拟它。如果创建,更新或删除了行,则可以更新实例化视图。尝试搜索它,这里有很好的描述。
如果源表很少更新,则很有用。如果您的select
很复杂,可能会有点困难。
临时表:CREATE TEMPORARY TABLE t1 (...);
和INSERT INTO t1 SELECT (your query);
(可以缩短为CREATE TEMPORARY TABLE t1 AS SELECT (your query)
)。这些表创建当前状态的快照,并且只要连接有效(即使通过事务处理)就可以使用,但是不能在连接之间共享。您可以添加索引等以加快查询速度。如果您有一个复杂的流程需要存储该流程中多次处理的数据,这将非常有用。
创建一个存储值的列,并创建一个MySQL EVENT
来定期对其进行更新。
恕我直言,由于20天移动平均值应该每天更新,因此最后的解决方案是最好的。如果您不信任MySQL或拥有其他作业调度程序,则也可以从那里调用updater SQL语句。