Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-добрият начин в MySQL или Rails да получите AVG на ден в рамките на определен период от време

Има ли причина (различна от вече споменатата дата), поради която не бихте използвали вградените възможности за групови функции в ActiveRecord? Изглежда, че сте загрижени за „последващата обработка“, която не мисля, че е нещо, за което да се притеснявате.

Вие сте в Rails, така че вероятно първо трябва да търсите решение за Rails[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“ е някаква грешка в транскрипцията, между другото – ако не, вие донякъде не сте наясно с именуването на класа си!)

След всичко това вие сте се върнали откъдето сте започнали, но сте стигнали дотам по по-конвенционален начин на Rails (а Rails наистина цени конвенциите!). Сега трябва да запълним пропуските.

Предполагам, че знаете своя период от време, да кажем, че е дефиниран като всички дати от 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. MySQL DB избира записи със и без умлаути. напр.:'.. където нещо =FÖÖ'

  2. Изберете заявка, но покажете резултата от запис номер 3

  3. Преброяване на общия брой редове и групиране по колона в mysql

  4. Десериализирайте чрез заявка на самото ниво на база данни

  5. Достъпът е отказан за потребител 'root'@'localhost' с PHPMyAdmin