我想显示最近更新的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;
我似乎无法使逻辑正确,任何帮助都非常感激。
答案 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;