Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Der beste Weg in MySQL oder Rails, um AVG pro Tag innerhalb eines bestimmten Datumsbereichs zu erhalten

Gibt es einen Grund (anders als den bereits erwähnten), warum Sie die eingebauten Gruppenfunktionsfähigkeiten in ActiveRecord nicht verwenden würden? Sie scheinen sich Sorgen um die "Nachbearbeitung" zu machen, was meiner Meinung nach kein Grund zur Sorge ist.

Sie befinden sich in Rails, also sollten Sie wahrscheinlich zuerst nach einer Rails-Lösung suchen[1]. Mein erster Gedanke wäre, so etwas wie

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

aus dem ActiveRecord so ziemlich das von Ihnen beschriebene SQL wurde. Angenommen, es gibt einen deklarierten has_many Verbindung zwischen Händler und Produkt, dann sollten Sie diese wahrscheinlich besser verwenden, also so etwas wie:

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

(Ich hoffe, dass Ihre Beschreibung des Modells als "products_sold" eine Art Transkriptionsfehler ist, übrigens - wenn nicht, liegen Sie mit Ihrer Klassenbenennung etwas daneben!)

Nach all dem sind Sie wieder dort, wo Sie angefangen haben, aber Sie sind auf eine konventionellere Rails-Weise dorthin gekommen (und Rails schätzt Konventionen wirklich!). Jetzt müssen wir die Lücken füllen.

Ich gehe davon aus, dass Sie Ihren Datumsbereich kennen, sagen wir, er ist definiert als alle Daten ab from_date bis to_date .

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

Dadurch wird die vollständige Liste der Daten als Array erstellt. Wir brauchen die Daten nicht, an denen wir einen Durchschnitt erhalten haben:

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

Das Ganze sieht für mich etwas unübersichtlich aus:Ich denke, es könnte knapper und sauberer sein. Ich würde versuchen, einen Hash oder eine Struktur zu erstellen, anstatt in Arrays zu bleiben.

[1] Ich sage nicht, dass Sie SQL nicht verwenden sollten – es gibt Situationen, in denen ActiveRecord nicht die effizienteste Abfrage generieren kann und Sie auf find_by_sql zurückgreifen . Das ist in Ordnung, es soll so sein, aber ich denke, Sie sollten versuchen, es nur als letzten Ausweg zu verwenden.