我想显示价格上涨或下跌的 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%
percent_change 在这里不断变化,因为前 3 个价格是唯一可用的价格,而且它们来自一家商店。
约束
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;
我似乎无法理解正确的逻辑,非常感谢任何帮助。
最佳答案
使用用户定义的变量 @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;
关于MySQL 近期产品价格更新的百分比变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108943/