I am currently adding crypto market data to my mysql database. I have the following data per minute :
Open time Close time Highest price Lowest price Number of trades
I would like to add the simple moving average of different time periods to the mysql database. I tried to do this calculation in python but this took to much time. Therefore, I calculated the SMA of a 50 day time period with the following query.
mycursor.execute(
"""select
open_date,
avg(close) over(rows between 49 preceding and current row)
from {}""".format(use_table)
)
However, besides making the query I would like to directly update the outcome for the SMA in the database. Preferably, I would like to have a query that is able to update all the SMA’s that are not yet calculated. Since I updated my database once a day.
Since I am new with using SQL any advise about how to update a column with the SMA would be very helpful.
Advertisement
Answer
It is possible to turn your SELECT query into an UPDATE. The trick is to invoke the window function (AVG(...) OVER(...)) within a suquery. You can use a WHERE clause to update only the records that were not yet calculated.
UPDATE mytable trg
INNER JOIN (
SELECT
open_date,
AVG(close) OVER(ROWS BETWEEN 49 PRECEDING AND CURRENT ROW) sma
FROM mytable
) src ON trg.id = src.id
SET trg.sma = src.sma
WHERE trg.sma IS NULL;