2012-10-21 18 views
5

मैं निम्न तालिका को अद्यतन करने के लिए कुछ मदद (अधिमानतः एक डमी की मार्गदर्शिका) इस्तेमाल कर सकते हैं में बंद शेयर की कीमतों के सरल चलती औसत के साथ अद्यतन करने की मेज:गिना जा रहा है और 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 स्तंभ अब खाली है। अन्य सभी कॉलम आबादी वाले हैं (समय के लिए, मैं "स्थैतिक" होने के साथ ठीक हूं, मुझे पंक्तियों को जोड़ने के रूप में अपडेट करने की आवश्यकता नहीं है - हालांकि यदि यह करना आसान है, तो यह बहुत अच्छा होगा)। यह एक 20-दिन चलने वाला औसत है जिसे मैं गणना करने की आशा करता हूं।

How do I calculate a moving average using MySQL?

मेरे प्रश्न यह है::

मैं चरणों मेरी क्षमता का सबसे अच्छा करने के लिए यहाँ प्रदर्शन से कोशिश की है

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 

मैं क्वेरी सही ढंग से संशोधित है? Moving_average कॉलम में परिणामों को लिखने के लिए क्या करने की आवश्यकता है?

जब मैं ऊपर चलाता हूं, कुछ भी नहीं होता है (यह कहता है कि यह चल रहा है, कोई त्रुटि नहीं है, इसे लंबे समय तक चलाने के बाद मैंने इसे अभी रोक दिया है)। कॉलम moving_average अभी भी शून्य मान है।

मैं भी इस सवाल का जवाब को देखा: How to calculated multiple moving average in MySQL

हालांकि, मैं अनिश्चित मैं क्या मेरी मेज के लिए उत्तर के लिए बदलने की जरूरत है हूँ।

किसी भी मदद की सराहना की जाती है।

  1. एक update क्वेरी जो आपकी सारणी के प्रत्येक पंक्ति को अद्यतन करता
  2. एक संग्रहीत प्रक्रिया है कि काम

मैं व्यक्तिगत रूप से विकल्प पसंद करता है बनाएँ:

+2

आपके द्वारा पोस्ट किए गए बयान में कोई अपडेट कथन नहीं है। बस एक चयन करें। स्वाभाविक रूप से, इसका मतलब है कि कुछ भी अपडेट नहीं होगा। – SchmitzIT

उत्तर

2

ऐसा करने के दो तरीके हैं 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

धन्यवाद बारंकका - मैंने इसकी प्रतिलिपि बनाई और चिपकाया और इसे चलाने का प्रयास किया। नतीजा था "क्वेरी खाली थी"। मैंने "प्रक्रिया की स्थिति दिखाएं" और यह खाली था। क्या मुझे इसे और संशोधित करना चाहिए? किसी भी तरह से, मदद के लिए धन्यवाद! – gcubed

+0

@ user1644609 आपको यह जांचने की आवश्यकता हो सकती है कि मैंने सबकुछ सही लिखा है (मुझे लगता है कि मैंने खराब नहीं किया है, लेकिन हमेशा मुझे मौका मिला है), और फिर अपनी तालिका जांचें ... क्या गणना सही है? – Barranka

+0

मैंने इसे "डीबग" करने का प्रयास किया है, लेकिन ईमानदारी से यह नहीं पता कि यह सही है या नहीं। मैंने इसके साथ थोड़ा सा खेला है (और जारी रहेगा) लेकिन संग्रहीत प्रक्रिया बनाने में सक्षम नहीं है, न ही mov_Average कॉलम में तारीख को पॉप्युलेट कर रहा है। लेकिन मुझे ट्रैक पर रखने के लिए धन्यवाद। – gcubed

0

यहां एक संभावित समाधान है:

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 

क्षमा करें मैं अपने myqql का उपयोग नहीं करता, इसलिए मैं अंकगणित वाक्यविन्यास की तारीख पर अनुमान लगा रहा हूं। और मैंने केवल पंक्तियों को अपडेट करने के लिए एक शर्त जोड़ा जहां आपका moving_average शून्य है।

अद्यतन: सुनिश्चित करें कि आप समझते हैं कि यह समाधान 365-दिन कैलेंडर पर आधारित है। "20-दिन" या "30-दिन" जैसे अधिकांश शेयर बाजार औसत एक व्यापार कैलेंडर पर आधारित होते हैं जिसमें सप्ताहांत और छुट्टियां शामिल नहीं होती हैं। आपको स्वयं एक व्यापार कैलेंडर तालिका बनाना होगा (सभी व्यापार तिथियों की एक साधारण सूची)। यदि आप ऐसा करना चाहते हैं, तो आप उस प्रभाव पर एक नया प्रश्न पूछना चाहेंगे।

संबंधित मुद्दे