这是我的简化历史表结构:
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
created_at
字段在过去24小时内price
列在记录的历史记录中具有不同值的记录,而不是-1 我真的在#2和#3中遇到问题,特别是过滤结果。我不希望通过循环#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)
上的索引。