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

标签 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%

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;

SQLFiddle

我似乎无法理解正确的逻辑,非常感谢任何帮助。

最佳答案

使用用户定义的变量 @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

关于MySQL 近期产品价格更新的百分比变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108943/

相关文章:

mysql - 在 Zend Framework 中查询 mysql 数据库 TableView

mysql - 无法让 WordPress 数据库查询工作

mysql - 一些帮助查找此 SQL 语句中的错误

php - 更新不适用于 MySQL 和 PHP

java - MySQL 日期和时间插入错误

PHP表单从MYSQL表中删除不删除右侧行

php - 在mysql数据库表单元格中插入链接

mysql - Rails 3.2.2 SQL 查询生成器

mysql - 如何为不同类型的列编写单个查询

mysql - 提高子查询sql语句的速度(mysql)