最近产品价格更新中的MySQL百分比变化

时间:2016-01-31 00:32:58

标签: mysql

我想显示最近更新的10款产品,其价格价格上涨或下跌,并显示其变化百分比+/-%并忽略当前低价和之前低价的产品是相同的,也忽略了以前没有价格的产品,例如只有一个价格记录的产品。

price_table(价格上涨或下跌)

id      prod_id price   store   added
----------------------------------------------------
1000    462     2.00    4       2016-01-27 00:54:47
807     462     3.09    2       2016-01-22 15:06:20
720     462     3.49    2       2016-01-16 09:31:01
608     462     2.89    2       2016-01-15 14:09:58

我们在此处看到最低价格为2.89,因此在插入3.49时价格差异为+17.19%,然后插入3.09,因此与3.49之前的低价格为-12.94%,然后插入了2.00的最新低价,现在3.09的新最低价差为-35.28%

price   store   percent_change
-------------------------------
2.89    2       
3.49    2       +17.19%
3.09    2       -12.94%
2.00    4       -35.28%

由于前三个价格是唯一可用的价格而且来自一家商店,所以百分比变化在这里不断变化。

约束

price_table(最低价格永不改变)

id      prod_id price   store   added
----------------------------------------------------
140     140     19.99   1       2016-01-15 14:09:30
394     140     20.99   2       2016-01-15 14:09:48
991     140     24.99   4       2016-01-27 00:54:47
1361    140     21.49   2       2016-01-29 19:53:30

正如您在上表中看到的那样,最低价格为19.99,因为商店1自添加以来未更新,其他3个价格条目已全部超过19.99以及此最低价格之后,因此该产品没有以前的最低价格,因此应忽略这些产品。

price_table(两家商店的最低价格相同)

id      prod_id price   store   added
----------------------------------------------------
1280    374     8.99    5       2016-01-29 00:45:59
1247    374     10.49   2       2016-01-27 18:13:33
803     374     10.99   2       2016-01-22 15:06:20
374     374     8.99    1       2016-01-15 14:09:44

在这里,您会看到最低价格为8.99,最近价格为8.99,这些产品应该被忽略。

当前逻辑

<(>(当前最低价 - 前最低价)/以前最低价)* 100

当前SQL

SELECT pr1.prod_id AS product
, (((pr1.price - (SELECT price
    FROM price
    ORDER BY price ASC
    LIMIT 1,1)) / pr1.price) * 100) AS diff
FROM price pr1
ORDER BY pr1.price ASC;

SQLFiddle

我似乎无法使逻辑正确,任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

使用用户定义的变量@prev_prod_id@prev_price来跟踪之前的prod_id和价格。

使用以下查询来获取要过滤的prod_id:

select distinct a.prod_id
from (
  select prod_id, min(price) price, min(added) added
  from price a
  group by prod_id) a
join price b on a.added = b.added and a.price = b.price

所有在一起:

select a.prod_id, a.price, a.store, 
 @prev_prod_id, @prev_price,1-@prev_price/a.price,
  if(@prev_prod_id = a.prod_id, 1-@prev_price/a.price, null)
    *if(@prev_price:=a.price,1,1)
    *if(@prev_prod_id:=a.prod_id,1,1) diff
from price a
join (select @prev_prod_id:=null, @prev_price:=null) b
left join (
  select distinct a.prod_id
  from (
    select prod_id, min(price) price, min(added) added
    from price a
    group by prod_id) a
  join price b on a.added = b.added and a.price = b.price) c on a.prod_id = c.prod_id
where c.prod_id is null
order by a.prod_id, a.added;

fiddle