Mysql
 sql >> Database >  >> RDS >> Mysql

Il modo migliore in MySQL o Rails per ottenere AVG al giorno entro un intervallo di date specifico

C'è un motivo (diverso dalla data già menzionata) per cui non dovresti utilizzare le funzionalità della funzione di gruppo integrate in ActiveRecord? Sembra che tu sia preoccupato per la "post-elaborazione", che non credo sia davvero qualcosa di cui preoccuparsi.

Sei in Rails, quindi probabilmente dovresti prima cercare una soluzione Rails[1]. Il mio primo pensiero sarebbe fare qualcosa come

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

che ActiveRecord ha trasformato praticamente nell'SQL che hai descritto. Supponendo che ci sia un has_many dichiarato associazione tra Commerciante e Prodotto, probabilmente faresti meglio a usarla, quindi qualcosa come:

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

(spero che la tua descrizione del modello come "prodotti_venduti" sia una sorta di errore di trascrizione, tra l'altro - in caso contrario, sei un po' fuori messaggio con la denominazione della tua classe!)

Dopo tutto questo, sei tornato dove hai iniziato, ma ci sei arrivato in un modo più convenzionale di Rails (e Rails apprezza davvero le convenzioni!). Ora dobbiamo colmare le lacune.

Presumo che tu conosca il tuo intervallo di date, diciamo che è definito come tutte le date da from_date a to_date .

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

Ciò crea l'elenco completo delle date come matrice. Non abbiamo bisogno delle date in cui abbiamo ottenuto una media:

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

Quel lotto mi sembra un po' disordinato:penso che potrebbe essere più conciso e più pulito. Indagherei sulla creazione di un Hash o Struct piuttosto che rimanere negli array.

[1] Non sto dicendo di non utilizzare SQL:si verificano situazioni in cui ActiveRecord non può generare la query più efficiente e si ricorre a find_by_sql . Va bene, dovrebbe essere così, ma penso che dovresti provare a usarlo solo come ultima risorsa.