我使用此查询来获取过去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数据库)
答案 0 :(得分:0)
我有一个类似的案例并使用以下方法解决了它:
tmpLatestDates
,您可以在该表中按产品分组并使用MAX(date)
tmpLatestPrices
:使用您的产品和日期价格表加入tmpLatestDates
,仅保留tmpLatestDates
行。这为您提供了每种产品的最新价格。tmpLatestPrices
对大型数据集执行此操作时,您希望在创建临时表后将其添加到临时表中。在你完成之后也不要忘记放下临时桌子。
处理它的最实用的方法是将所有查询放在存储过程中。
编辑:您可以使用子查询遵循相同的逻辑,但我找到了temp。表格方法更容易理解,并且以后简化了维护。