Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक विशिष्ट तिथि सीमा के भीतर प्रति दिन औसत प्राप्त करने के लिए MySQL या रेल में सबसे अच्छा तरीका

क्या कोई कारण है (पहले से उल्लिखित तिथि के अलावा) आप ActiveRecord में अंतर्निहित समूह फ़ंक्शन क्षमताओं का उपयोग क्यों नहीं करेंगे? ऐसा लगता है कि आप "पोस्ट-प्रोसेसिंग" के बारे में चिंतित हैं, जो मुझे नहीं लगता कि वास्तव में चिंता का विषय है।

आप रेल में हैं, इसलिए आपको शायद पहले रेल समाधान की तलाश करनी चाहिए [1]। मेरा पहला विचार कुछ ऐसा करना होगा

Product.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])

कौन सा ActiveRecord आपके द्वारा वर्णित SQL में बहुत अधिक बदल गया है। मान लें कि एक घोषित has_many है व्यापारी और उत्पाद के बीच संबंध, तो आप शायद इसका उपयोग करना बेहतर समझते हैं, इसलिए कुछ ऐसा:

ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")

(मुझे आशा है कि "products_sold" के रूप में मॉडल का आपका विवरण किसी प्रकार की ट्रांसक्रिप्शन त्रुटि है, btw - यदि नहीं, तो आप अपनी कक्षा के नामकरण के साथ कुछ हद तक ऑफ-मैसेज हैं!)

आखिरकार, आप वापस वहीं हैं जहां आपने शुरू किया था, लेकिन आप वहां एक और पारंपरिक रेल तरीके से पहुंचे (और रेल वास्तव में सम्मेलनों को महत्व देते हैं!) अब हमें रिक्तियों को भरने की जरूरत है।

मैं मान लूंगा कि आप अपनी तिथि सीमा जानते हैं, मान लें कि इसे from_date से सभी तिथियों के रूप में परिभाषित किया गया है से to_date . तक ।

date_aves = (from_date..to_date).map{|dt| [dt, 0]}

यह एक सरणी के रूप में तिथियों की पूरी सूची बनाता है। हमें उन तिथियों की आवश्यकता नहीं है जहां हमें औसत मिला:

ave_price_dates = ave_prices.collect{|ave_price| ave_price[0]} # build an array of dates
date_aves.delete_if { |dt| ave_price.dates.index(dt[0]) } # remove zero entries for dates retrieved from DB
date_aves.concat(ave_prices)     # add the query results
date_aves.sort_by{|ave| ave[0] } # sort by date

वह बहुत कुछ मुझे थोड़ा अव्यवस्थित लगता है:मुझे लगता है कि यह छोटा और साफ-सुथरा हो सकता है। मैं सरणियों में रहने के बजाय हैश या स्ट्रक्चर बनाने की जांच करूंगा।

[1] मैं यह नहीं कह रहा हूं कि SQL का उपयोग न करें - ऐसी स्थितियां होती हैं जहां ActiveRecord सबसे कुशल क्वेरी उत्पन्न नहीं कर सकता है और आप find_by_sql पर वापस आते हैं . यह ठीक है, इसे ऐसा ही होना चाहिए, लेकिन मुझे लगता है कि आपको इसे केवल अंतिम उपाय के रूप में उपयोग करने का प्रयास करना चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 1030 स्टोरेज इंजन से त्रुटि 28 मिली

  2. Google डेटा स्टूडियो - MySQL कनेक्टर त्रुटि के लिए क्लाउड SQL

  3. संग्रहीत कार्यविधि का उपयोग करके मेरे द्वारा वांछित मान को पुनः प्राप्त नहीं किया जा सकता है

  4. कई कंटेनर इंस्टेंस के साथ डॉकटर कंटेनर में रेल के साथ माइग्रेशन चलाना

  5. Django के बाहर Django डेटाबेस परत का उपयोग करना?