当前位置:  开发笔记 > 后端 > 正文

MySQL或Rails在特定日期范围内每天获得AVG的最佳方式

如何解决《MySQL或Rails在特定日期范围内每天获得AVG的最佳方式》经验,为你挑选了1个好方法。

我正在尝试在Rails中制作图表,例如在给定日期范围内每天的平均销售额

假设我有一个product_sold模型,它具有"sales_price"浮点属性.但是如果特定日期没有销售(例如模型/ db中没有),我想简单地返回0.

MySQL/Rails完成这项工作的最佳方法是什么?我知道我可以这样做:

(这个SQL查询可能是完全错误的方式来获得我想要的东西)

SELECT avg(sales_price) AS avg, DATE_FORMAT(created_at, '%m-%d-%Y') AS date
    FROM products_sold WHERE merchant_id = 1 GROUP BY date;

得到这样的结果:

| avg |    date    |
  23    01-03-2009
  50    01-05-2009 
  34    01-07-2009
  ...       ...

我想得到的是:

| avg |    date    |
  23    01-03-2009
   0    01-04-2009
  50    01-05-2009
   0    01-06-2009 
  34    01-07-2009
   0    01-08-2009
  ...       ...

我可以使用SQL执行此操作,还是必须对结果进行后处理以查找日期范围中的哪些日期不在SQL结果集中?也许我需要一些子选择或IF语句?

感谢大家的帮助.



1> Mike Woodhou..:

是否有原因(除了已经提到的日期之外)为什么不使用ActiveRecord中的内置组功能?您似乎关注"后期处理",我认为这并不值得担心.

你在Rails中,所以你应该首先寻找一个Rails解决方案[1].我的第一个想法是做类似的事情

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

哪个ActiveRecord变成了你描述的SQL.假设has_manyMerchant和Product之间存在声明的关联,那么你可能会更好地使用它,所以类似于:

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

(我希望您对模型的描述为"products_sold"是某种转录错误,顺便说一下 - 如果没有,您的课程命名就会有点消息!)

毕竟,你回到了开始的地方,但是你以更传统的Rails方式到达那里(Rails真的很重视惯例!).现在我们需要填补空白.

我假设你知道你的日期范围,比方说,它的定义为所有日期from_dateto_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

这一批看起来有点混乱:我认为它可能更温和,更清洁.我正在研究构建一个Hash或Struct,而不是留在数组中.


[1]我并不是说不使用SQL - 在ActiveRecord无法生成最有效查询的情况下确实会出现这种情况find_by_sql.这很好,它应该是这样的,但我认为你应该尝试使用它作为最后的手段.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有