与上个月相比,如何获得最大的差异?

时间:2017-03-07 15:32:42

标签: mysql

我有两张桌子 - 产品和价格

每个月的表格价格都包含每种产品的新价格。如何获得价格与上个月价格差异最大的5种产品?

表产品

id | price | product_id | created_at
 1 |  10   |      1     | 2017-02-07 07:00:00
 2 |  10   |      2     | 2017-02-07 07:00:00
 3 |  15   |      3     | 2017-02-07 07:00:00
 5 |  15   |      1     | 2017-03-07 07:00:00
 6 |  20   |      2     | 2017-03-07 07:00:00
 7 |  25   |      3     | 2017-03-07 07:00:00

表价格

1.    Bananas has prices by 15 higher (lastMonth: 15, now: 25)
2.    Pears 2 has prices by 10 higher (lastMonth: 10, now: 20)
3.    Apples has prices by 5 higher (lastMonth: 10, now: 15)

结果就是找出那个

SELECT products.id, products.name, prices.beforePrice, prices.afterPrice, prices.difference 
FROM products
INNER JOIN prices ON products.id = prices.product_id
WHERE 
     ( 
      SELECT *biggest-difference*
      FROM prices
      WHERE *difference_between_last_2_months*
      GROUP BY product_id
      LIMIT 5
     )

我在想这样的事(我知道这很可怕)

{{1}}

2 个答案:

答案 0 :(得分:2)

您可以使用基于fliterd select by month的正确联接。

这应该返回你需要的值(你可以添加你需要的文字字符串)

select p.name, m1.price as this_month, m2.price as prev_month, m2.price-m1.price as diff 
from product  
left join  (
      select price, product_id
      from Prices 
      where month(created_at) = month(NOW()) 
      and year(created_at) = year(NOW())
    ) m1 on m1.product_id = p.id
left join  (
      select price, product_id
      from Prices 
      where month(created_at) =  MONT(DATE_SUB(NOW(), INTERVAL 1 MONTH)
      and year(created_at) = year(DATE_SUB(NOW(), INTERVAL 1 MONTH)
    ) m2 on m2.product_id = p.id
 order by diff desc
 limit 5

答案 1 :(得分:2)

创建表/插入数据

SUM(pagos.pagoMonto) AS total

<强>查询

CREATE TABLE Products
    (`id` INT, `name` VARCHAR(7))
;

INSERT INTO Products
    (`id`, `name`)
VALUES
    (1, 'apples'),
    (2, 'pears'),
    (3, 'bananas')
;


CREATE TABLE Prices
    (`id` INT, `price` INT, `product_id` INT, `created_at` DATETIME)
;

INSERT INTO Prices
    (`id`, `price`, `product_id`, `created_at`)
VALUES
    (1, 10, 1, '2017-02-07 07:00:00'),
    (2, 10, 2, '2017-02-07 07:00:00'),
    (3, 15, 3, '2017-02-07 07:00:00'),
    (5, 15, 1, '2017-03-07 07:00:00'),
    (6, 20, 2, '2017-03-07 07:00:00'),
    (7, 25, 3, '2017-03-07 07:00:00')
;

结果

SELECT 
   Products.id
 , Products.name  
 , (current_month.price - last_month.price) AS difference
 , (
    CASE 
       WHEN last_month.price > current_month.price
       THEN 'lower'

       WHEN last_month.price < current_month.price
       THEN 'higher'

     END
   ) AS incremental
 , last_month.price 'lastMonth'
 , current_month.price 'now'
FROM (
 SELECT 
  *
 FROM 
  Prices 
 WHERE
   MONTH(created_at) = MONTH((CURDATE() - INTERVAL 1 MONTH))
)
 AS
  last_month 
INNER JOIN (
  SELECT 
   *
  FROM 
   Prices 
  WHERE
    MONTH(created_at) = MONTH((CURDATE()))
)  
 AS 
  current_month
ON
  last_month.product_id = current_month.product_id
INNER JOIN
 Products
ON
  last_month.product_id = Products.id  
WHERE
  last_month.price < current_month.price #incremental should be higher
ORDER BY 
 difference DESC
LIMIT 5