显示给定ID的给定值更改的日期

时间:2017-09-20 10:30:32

标签: mysql sql

我需要检查给定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

很容易检查地址被更改的内容以及发生了多少次,但我没有任何线索如何显示我实际需要的结果。

2 个答案:

答案 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

在这里演示:

Rextester