एक समस्या जो मुझे बल्ले से दिखाई दे रही है, वह तारीख के लिए टाइमस्टैम्प डेटा प्रकार का उपयोग कर रही है, यह आपकी एसक्यूएल क्वेरी को दो कारणों से जटिल बना देगा - आपको एक श्रेणी का उपयोग करना होगा या अपने खंड में वास्तविक तिथि में कनवर्ट करना होगा, लेकिन, अधिक महत्वपूर्ण बात यह है कि , चूंकि आप कहते हैं कि आप आज के बंद भाव और कल के बंद भाव में रुचि रखते हैं, इसलिए आपको उन दिनों पर नज़र रखनी होगी जब बाज़ार खुला रहता है - इसलिए सोमवार की क्वेरी मंगल-शुक्र से भिन्न होती है, और किसी भी दिन बाज़ार बंद रहता है छुट्टी का भी हिसाब देना होगा।
मैं mktDay जैसा कॉलम जोड़ूंगा और हर दिन इसे बढ़ाऊंगा जब बाजार व्यापार के लिए खुला हो। एक और तरीका 'पिछला बंद' कॉलम शामिल करना हो सकता है जो आपकी गणना को छोटा बनाता है। मुझे एहसास है कि यह सामान्य रूप का उल्लंघन करता है, लेकिन यह आपकी क्वेरी में एक महंगे सेल्फ जॉइन को बचाता है।
यदि आप संरचना को नहीं बदल सकते हैं, तो आप कल के करीब आने के लिए एक सेल्फ जॉइन करेंगे और आप चाहें तो उस% परिवर्तन द्वारा% परिवर्तन और क्रम की गणना कर सकते हैं।
नीचे एरिक का कोड है, इसे माइस्क्ल 5.0.27 चलाने वाले मेरे सर्वर पर निष्पादित थोड़ा सा साफ किया गया है
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_today.price > 0
and p_yest.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10
बैक-टिक पर ध्यान दें क्योंकि आपके कुछ कॉलम नाम और एरिक के उपनाम आरक्षित शब्द थे।
यह भी ध्यान दें कि पहली तालिका के लिए जहां क्लॉज का उपयोग करना एक कम खर्चीला प्रश्न होगा - जहां पहले निष्पादित किया जाता है और केवल उन पंक्तियों में स्वयं से जुड़ने का प्रयास करना होता है जो शून्य से अधिक होती हैं और आज की तारीख होती है
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_yest.price > 0
where p_today.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10