MySQL:如何从历史表中获得价格变化?

时间:2016-04-10 13:14:40

标签: mysql

这是我的简化历史表结构:

id | property_id | price   | created_at          | updated_at          | deleted_at
1  |      1      |   100   | 2016-04-10 01:00:00 | 2016-04-10 01:00:00 | NULL
2  |      1      |   300   | 2016-04-10 01:00:00 | 2016-04-10 01:00:00 | NULL
3  |      1      |   300   | 2016-04-10 02:00:00 | 2016-04-10 02:00:00 | NULL
4  |      2      |   200   | 2016-04-10 03:00:00 | 2016-04-10 03:00:00 | NULL
1  |      2      |   150   | 2016-04-10 04:00:00 | 2016-04-10 04:00:00 | NULL
  1. 我想获取符合特定条件的记录,尤其是created_at字段在过去24小时内
  2. 我需要获得紧接在#1
  3. 中记录之前的记录
  4. 进一步过滤结果#1为price列在记录的历史记录中具有不同值的记录,而不是-1
  5. 我真的在#2和#3中遇到问题,特别是过滤结果。我不希望通过循环#1结果来做到这一点,因为我有很多数据,这需要花费很多时间。任何人都可以帮我在一个查询中做到这一点吗?

1 个答案:

答案 0 :(得分:2)

我们想到的是获得之前价格的相关子查询。以下版本使用having子句进行最终比较(也可以使用子查询):

select h.*,
       (select h2.price
        from history h2
        where h2.property_id = h.property_id and
              h2.created_at < h.created_at
        order by h2.created_at desc
        limit 1
       ) as prev_price
from history h
where h.created_at > date_sub(now(), interval 1 day)
having prev_price is null or prev_price <> price;

为了提高性能,您需要history(created_at)history(property_id, created_at, price)上的索引。