I am trying to use the window function I’m mySQL to find the SMA for stock prices. I was able to get this done with a SELECT statement however the ALTER table statement doesn’t allow me to use the window function. My idea is to use the select statement to find the averages and concatenate the original table with the column it returns:
SELECT
date_, close, AVG(close) OVER (ORDER BY date_ ASC ROWS 11 PRECEDING) AS SMA12 FROM intel_stock;
returns a table with 3 rows from the original table
Is there any way to “add/insert/join/unite” the newly calculated row to the right side of the original table (given that I have already added an extra empty column)?
Advertisement
Answer
You need to add the column first, then update it. The update ... join
syntax comes handy for the second step.
-- add the new column
alter table intel_stock add column sma12 float; -- or whathever datatype is needed
-- set the new column
update intel_stock ist
inner join (
select
date_,
avg(close) over (order by date_ rows 11 preceding) as sma12
from intel_stock
) ist1 on ist1.date_ = ist.date_
set ist.sma12 = ist1.sma12
Note that it is probably simpler to use a view to store that derived information. This saves your the tedious task of maintaining the new column when the data changes in the surrounding rows:
create view intel_stock as
select
is.*,
avg(close) over (order by date_ rows 11 preceding) as sma12
from intel_stock