在SQL中选择过去30天中每一天的平均价格

时间:2016-07-27 06:07:18

标签: mysql sql select

我使用此查询来获取过去30天内每个产品类别中产品的平均价格:

SELECT DATE(bsbp.date) AS pricedate, UNIX_TIMESTAMP(DATE(bsbp.date)) AS unixdate,
    ROUND(AVG((bsbp.price / 100) * (bc.exchangerate / 100)), 0) AS avgprice
FROM bd_shopbikesprices bsbp, bd_categoriesshopbikes bcsb, bd_shopbikes bsb,
bd_shops bs, bd_currencies bc 
WHERE bsbp.shopbikeid = bcsb.shopbikeid AND bcsb.categoryid = 94
    AND bsbp.shopbikeid = bsb.id AND bsb.shopid = bs.id AND bs.feedcurrencyid = bc.id 
    AND bsbp.price > 0 
GROUP BY DATE(bsbp.date) ORDER BY pricedate DESC LIMIT 30

问题是价格(bsbp)的表只包含价格变化,即每种产品的最后价格,其中价格不同于产品的先前价格(或产品是新的,因此没有&#39 ; t有先前的价格。)

像这样:

shopbikeid|date|price
890061|2016-07-27 02:50:01|29999
890061|2016-07-21 03:21:51|49999
890061|2016-07-17 21:20:55|29999
890061|2016-06-30 04:41:36|49999

目前查询采用每天的平均新价格,这不是实际平均价格,因为平均新价格仅涵盖价格变化的产品/新产品。

我的问题是如何重写查询,因此每日平均值是当天所有产品的平均价格,包括当天价格变更的产品。

可以通过一个不错的查询以某种方式完成吗? (数据库是MySQL数据库)

1 个答案:

答案 0 :(得分:0)

我有一个类似的案例并使用以下方法解决了它:

  • 从您的价格表中创建一个临时表tmpLatestDates,您可以在该表中按产品分组并使用MAX(date)
  • 创建另一个临时表tmpLatestPrices:使用您的产品和日期价格表加入tmpLatestDates,仅保留tmpLatestDates行。这为您提供了每种产品的最新价格。
  • tmpLatestPrices
  • 上运行原始查询

对大型数据集执行此操作时,您希望在创建临时表后将其添加到临时表中。在你完成之后也不要忘记放下临时桌子。

处理它的最实用的方法是将所有查询放在存储过程中。

编辑:您可以使用子查询遵循相同的逻辑,但我找到了temp。表格方法更容易理解,并且以后简化了维护。