我需要检查给定ID的地址何时更改,并显示更改的日期以及(旧的和新的)地址。
我们假设我们有这些数据:
id address date
1 Long Street 2015-09-20
1 Broad Street 2015-09-30
1 Nice Road 2016-09-30
2 Black Road 2016-09-30
2 White Road 2017-01-01
因此查询的输出应为:
1 Long Street Broad Street 2015-09-30
1 Broad Street Nice Road 2016-09-30
2 Black Road White Road 2017-01-01
很容易检查地址被更改的内容以及发生了多少次,但我没有任何线索如何显示我实际需要的结果。
答案 0 :(得分:2)
您可以使用相关子查询获取上一条记录的日期:
select t.id,
(select t2.address
from t t2
where t2.id = t.id and t2.date < t.date
order by t2.date desc
limit 1
) prev_address,
t.address, t.date
from t
having prev_address is not null;
使用having
子句是MySQL扩展。它的行为类似于使用列别名的where
子句。
答案 1 :(得分:2)
理想情况下,您的问题会使用超前/滞后分析功能。由于MySQL不支持它们,一种方法是使用会话变量来模拟它们。
SET @address = '';
SET @date = '';
SELECT
prev_address,
address,
date
FROM
(
SELECT
id,
@address AS prev_address,
@date AS prev_date,
@address:=address AS address,
@date:=date AS date
FROM yourTable
ORDER BY date
) t
WHERE
COALESCE(prev_date, date) <> date AND
prev_address <> '';
<强>输出:强>
prev_address address date
1 Long Street Broad Street 2015-09-30 00:00:00
2 Broad Street Nice Road 2016-09-30 00:00:00
3 Black Road White Road 2017-01-01 00:00:00
在这里演示: