2012-10-21 23 views
5
ben aşağıdaki tabloyu güncelleyerek için yardım (tercihen bir kukla kılavuzu) de kullanabilir

kapanış hisse senedi fiyatlarının basit hareketli ortalamaya güncellenmesi masanın:hesaplanması ve MYSQL

CREATE TABLE `SYMBOL` (
    `day` date NOT NULL, 
    `open` decimal(8,3) DEFAULT NULL, 
    `high` decimal(8,3) DEFAULT NULL, 
    `low` decimal(8,3) DEFAULT NULL, 
    `close` decimal(8,3) DEFAULT NULL, 
    `volume` bigint(20) DEFAULT NULL, 
    `adj_close` decimal(8,3) DEFAULT NULL, 
    `moving_average` decimal(8,3) DEFAULT NULL, 
    PRIMARY KEY (`day`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

moving_average sütun artık boş. Diğer tüm sütunlar (- bu, bu harika olurdu yapmak kolaydır eğer olsa şu an için, ben bu varlık "statik", ben satır eklemek olarak güncellemek zorunda değildir ile iyiyim) doldurulur. Hesaplamayı umduğum 20 günlük hareketli bir ortalama.

SELECT 
    `close`, 
    (
    SELECT 
      AVG(`close`) AS moving_average 
    FROM 
      SYMBOL T2 
    WHERE 
      (
       SELECT 
        COUNT(*) 
       FROM 
        SYMBOL T3 
       WHERE 
        `day` BETWEEN T2.day AND T1.day 
     ) BETWEEN 1 AND 20 
    ) 
FROM 
    SYMBOL T1 

Ben doğru sorguyu modifiye mı:

How do I calculate a moving average using MySQL?

Benim sorgu şudur:

benim geldiğince en iyi şekilde buraya adımları uygulayarak denediniz mi? Sonuçları hareketli_ortam sütununa yazmak için ne yapılması gerekiyor?

Yukarıda hiçbir şey olmuyor çalıştırmak

(buna ben sadece durdu uzun süre çalıştırmak icar sonra çalışan, hiç hata diyor). Moving_average sütununun hala NULL değerleri var.

Ben de bu cevabı baktı: How to calculated multiple moving average in MySQL

Ancak, benim tablo için cevap değiştirmek için gerekenleri emin değilim.

Herhangi bir yardım için teşekkür ederiz.

Şahsen seçeneği tercih işi yapan bir saklı yordam oluşturma, tablodaki her satır güncelleştiren bir update sorgusu oluşturun:

+2

Deftere deyimi içinde hiçbir güncelleme deyimi vardır. Sadece bir seçim. Doğal olarak, bu hiçbir şeyin güncellenmeyeceği anlamına gelir. – SchmitzIT

cevap

2

Bunu yapmanın iki yolu vardır 2:

delimiter $$ 
create procedure movingAvg() 
begin 
    declare mv double; 
    declare t date; 
    declare done int default false; 
    declare cur_t cursor for 
     select distinct day from symbol 
     order by day; 
    declare cur_mv cursor for 
     select avg(close) from symbol 
     where day between date_add(t, interval -19 day) and t; 
     -- Here you define the interval of your MV. 
     -- If you want a 20-day MV, then the interval is between t-19 and t 
    declare continue handler for not found set done=true; 

    open cur_t; 
    loop_day: loop 
     fetch cur_t into t; 
     if not done then 
      open cur_mv; 
      fetch cur_mv into mv; 
      close cur_mv; 
      update SYMBOL 
       set moving_average = mv 
       where day=t; 
     else 
      leave loop_day; 
     end if; 
    end loop loop_day; 
    close cur_t; 
end; 
delimiter ; 
+0

Barranka ederiz - Ben kopyalanıp bu yapıştırılan ve çalıştırın çalıştı. Sonuç "Sorgu boştu" idi. Ayrıca prosedür prosedürünü gösterdim ve boştu. Bunu daha fazla değiştirmeli miyim? Her iki durumda da yardım için teşekkürler! – gcubed

+0

@ user1644609 herşeyi doğru yazdığımı kontrol etmen gerekebilir (bence kendimi mahvettim, ama bir şeyleri kaçırdığım için her zaman bir şansım var), ve masanızı kontrol edin ... hesaplamalar doğru mu? – Barranka

+0

"Hata ayıklamayı" denedim, ancak doğru olup olmadığını bilmiyorum. Bununla biraz oynamıştım (ve devam edecek), ancak saklı yordamı oluşturamadım, ayrıca tarihçeyi hareketli_dosya sütununa yerleştiremedim. Ama beni takip ettiğin için teşekkürler. – gcubed

0

İşte olası bir çözüm:

update SYMBOLS 
from (
    select a.day 
     , avg(b.close) as moving_average 
    from SYMBOLS a 
    cross join SYMBOLS b 
    where b.day BETWEEN date_sub(a.day, INTERVAL 19 DAY) and a.day 
     and a.moving_average is null 
    group by a.day 
    ) x 
set moving_average=x.moving_average 
where SYMBOLS.day=x.day 

Üzgünüz, mysql'yi kendim kullanmıyorum, bu yüzden tarihin aritmetiği sözdizimini tahmin ediyorum. Ve senin moving_average boş sadece güncelleme satırları bir koşul ekledi.

UPDATE: Bu çözümün 365 günlük bir takvime dayandığını anladığınızdan emin olun. "20 günlük" veya "30 günlük" gibi çoğu borsa ortalamaları hafta sonları ve tatil günleri hariç bir ticaret takvime dayanır. Bir ticaret takvimi tablosu oluşturmalısınız (tüm ticaret tarihlerinin basit bir listesi). Bunu yapmak isterseniz, bu soruna yeni bir soru sormak isteyebilirsiniz.

İlgili konular