mysql - 从上个月的价格变化表中获取最后 2 条更新的unit_price

标签 mysql sql query-optimization

我有一个表,记录了每个cost_price、unit_price和special_price上商品的所有价格变化。即使其中一项定价与旧定价相比发生变化,该表也会记录数据。表结构示例如下。

 id | item_id | cost_price  | unit_price   | special_price | created_date
---------------------------------------------------------------------------
  1 |   101   |    100      |  NULL        |   NULL        | 2018-07-15 10:02:20
  2 |   102   |   NULL      |  250         |   NULL        | 2018-07-16 12:23:00
  3 |   101   |   NULL      |  150         |   NULL        | 2018-07-16 10:02:20
  4 |   101   |   NULL      |  200         |   NULL        | 2018-07-18 12:23:00
  5 |   101   |   NULL      |  201         |   NULL        | 2018-07-22 10:02:20
  6 |   102   |   NULL      |  283         |   NULL        | 2018-07-28 12:23:00

我想从上表中获取上个月的以下输出(日期为 2018 年 7 月 13 日)

item_id   |   unit_price   | changed_date
-----------------------------------------
   101    |    201         | 2018-07-22 10:02:20
   101    |    200         | 2018-07-18 12:23:00
   102    |    283         | 2018-07-28 12:23:00

我需要上面的输出,其中仅显示unit_price中发生的最后两次更改。

最佳答案

这可能看起来很复杂:

SELECT t1.item_id,t1.unit_price,t1.created_date AS changed_date
FROM table_name t1 INNER JOIN 
   (
    SELECT a.item_id, a.unit_price, MAX(a.created_date) AS changed_date
    FROM table_name a INNER JOIN 
    (SELECT item_id, unit_price, MAX(created_date) AS changed_date
    FROM table_name GROUP BY item_id, unit_price) b
    ON a.item_id =  b.item_id and a.created_date < b.changed_date
    GROUP BY a.item_id, a.unit_price
   ) t2
   ON t1.item_id = t2.item_id AND t1.created_date >= t2.changed_date

关于mysql - 从上个月的价格变化表中获取最后 2 条更新的unit_price,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51833860/

相关文章:

mysql - SQL 优化 - 3 个表 - 多个 SUM - 20k 记录 - 12 秒

sql - Mysql提高SELECT速度

具有多个选项的 PHP Laravel 复杂查询

php - 在 MySQL 中存储 XML 的最佳方式

php - MYSQL,在搜索时让 AE 等于 Æ

php - SQL选择查询

java - 试图将 Java 变量传递给 sql 字符串

PHP PDO lastInsertId() 函数混淆

sql - 选择不同的列并获取另一列的计数

mysql - 为什么 MySQL 不使用我的索引?优化mysql select查询