sql >> データベース >  >> RDS >> Mysql

MySQLまたはRailsで、特定の日付範囲内で1日あたりのAVGを取得するための最良の方法

    ActiveRecordに組み込まれているグループ機能機能を使用しない理由(すでに述べた日付以外)はありますか?あなたは「後処理」について心配しているようですが、それは本当に心配することではないと思います。

    あなたはRailsにいるので、おそらく最初にRailsソリューションを探す必要があります[1]。私の最初の考えは次のようなことをすることです

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

    どのActiveRecordがあなたが説明したSQLにほとんど変わったか。宣言されたhas_manyがあると仮定します MerchantとProductの関連付けの場合は、おそらくそれを使用したほうがよいでしょう。たとえば、次のようになります。

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

    (「products_sold」としてのモデルの説明が、ある種の転記エラーであることを願っています。ところで、そうでない場合は、クラスの名前付けに多少のメッセージがありません!)

    その後、あなたは最初の場所に戻りますが、より一般的なRailsの方法でそこに到達しました(そしてRailsは本当に慣習を大切にしています!)。次に、ギャップを埋める必要があります。

    日付範囲を知っていると仮定します。たとえば、from_dateからのすべての日付として定義されているとします。 to 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. テーブルの列の順序について心配する理由はありますか?

    2. MySQL行からのQRコードの生成

    3. asp.netアプリケーションで接続を開閉するための良い習慣はありますか?

    4. Microsoft SQL Serverへのログインエラー:18456