2017-09-20 44 views
1

我需要檢查給定ID的地址何時發生更改,並顯示更改的日期以及(舊地址和新地址)。當給定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 

可以很容易地檢查該ID的地址被改變,多少次發生了,但我沒有任何線索如何顯示我實際需要的結果。

+0

你怎麼決定,如果寬街之前或尼斯後道去? – jarlh

+0

@jarlh:2016年是在2015年之後:-) –

+0

@ThorstenKettner,我現在覺得很愚蠢......再喝一杯咖啡是我唯一的藉口。 – jarlh

回答

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子句。

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

+0

問題是我正在使用Jasper Reports,而且這個庫相當滯後,我需要編寫一個簡單的查詢,而不聲明任何變量。 – CorrieSparrow

+0

@CorrieSparrow老鼠..我花了20分鐘的這個答案。也許戈登的迴應會適合你的需求。順便說一句,我添加了一個演示。 –

+0

MySQL不保證「SELECT」中表達式求值的順序。在一個表達式中分配一個變量,然後在另一個表達式中使用它是不安全的。警告很明確:「但是,涉及用戶變量的表達式的評估順序未定義。」 (https://dev.mysql.com/doc/refman/5.7/en/user-variables.html)。 –

相關問題