2017-08-01 9 views
0

私はSequel Pro(Mac用MySQLアプリケーション)に財務データベースをまとめています。私は価格/株価を記録するテーブルを持っており、デルタ(日々の変更)や最終的に移動平均などのような計算された値を維持する2番目のテーブルを持っています。データを取り出すときよりも、値が更新/挿入されるときです。Sequel Proのトリガ、2番目のテーブルの計算フィールドを更新

私は基本的に問題は(アップデート後)トリガということですROW_NUMBER()の算出営業日に対処するための同等物だけではなく、通常の日または非連続的な日付/ IDが

で一時テーブルを使用することを抱えています何もしていないようだが、それでも失敗しているとは思わない。私はちょうどいくつかの既存の値を変更することによってそれをテストするために行くと計算フィールドは同じままです。私はこれが構文のことだと思いますか? SequelPro/MySQLは、私はちょうどPHPで余分なコードのセットを構築して追加することを決めた...最後に

BEGIN 

CREATE TEMPORARY TABLE IF NOT EXISTS predata AS 
(SELECT thedate 
,price_cash 
,price_3m 
,stocks 
FROM aluminium 
WHERE thedate BETWEEN DATE_ADD(NEW.thedate,INTERVAL -6 DAY) 
AND DATE_ADD(NEW.thedate,INTERVAL 5 DAY)); 

CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS 
(SELECT t.*, @rownum := @rownum + 1 AS rank 
FROM predata t, 
(SELECT @rownum := 0) r 
ORDER BY thedate ASC); 

CREATE TEMPORARY TABLE IF NOT EXISTS temp2 AS(SELECT * FROM temp1); 

CREATE TEMPORARY TABLE IF NOT EXISTS result_delta AS 
(
SELECT b.thedate 
,(b.price_cash - a.price_cash) AS delta_cash 
,(b.price_3m - a.price_3m) AS delta_3m 
,(b.stocks - a.stocks) AS delta_stocks 
FROM temp1 a 
INNER JOIN temp2 b ON b.rank-1 = a.rank 
WHERE b.thedate = NEW.thedate 
OR a.thedate = NEW.thedate 
); 

UPDATE aluminium_calcs a 
INNER JOIN result_delta r ON a.thedate = r.thedate 
SET a.delta_cash = r.delta_cash 
, a.delta_3m = r.delta_3m 
, a.delta_stocks = r.delta_stocks; 

END 
+0

これはトリガーのコードですか?なぜ、編集中の行を参照するのに 'old'と' new'を使用していませんか? – Fredster

+0

はい。私はNEW.thedateを使用して、更新されている行(日)を選んでいます。その後、そのエントリは前日と後日に使用され、日々の変更を計算し、最後に '計算'テーブルを更新します。トリガーは基本価格/在庫データのみを含むテーブル上にあります。 "_calcs"テーブルは計算された値をログに記録します – CalvinGraham

+0

これはおそらくこれがトリガーに固執するにはあまりにも多くのものであると思われ始めました。おそらく、さまざまな異なるストアドプロシージャのセット計算された列/メトリックを使用して、トリガを使用して日付をパラメータとしてプロシージャをコールしますか?しかし、質問10657は間違いなくそれをしないと言います。 – CalvinGraham

答えて

0

私は通常私の一日の仕事で、SQL Serverを持っているだろうと、私はまだ見てのために少し奇妙です更新画面に( 'deltas_update.php')を含めてください。とにかく、SQLよりも適切な配列/ループとphoコードで計算を行う方が簡単なので、おそらくもっと良い解決策です。 MySQLはかなり裸の骨ですが、他の場所で重い作業を見やすく/追跡しやすい場所にプッシュする方が良いでしょう。

関連する問題