2017-09-06 61 views
1

我一直在尋找如何跟蹤表中的值更改,因爲我目前希望能夠捕獲屬性的第一個日期,但如果我擁有幾天後,屬性A變爲屬性B,然後在幾周內再次返回屬性A.使用數據跟蹤Oracle SQL中的更改

以下是我的數據集:

Attributes | DateTime 
A | 01/08/2017 00:01:45 
A | 02/08/2017 00:30:00 
B | 03/08/2017 00:45:57 
A | 07/08/2017 13:00:00 

現在我可以寫:

SELECT Attributes, MIN(DateTime); 

這給了我:

Attributes | DateTime 
A | 01/08/2017 00:01:45 
B | 03/08/2017 00:45:57 

但我想是要能夠再次看到屬性A,但不知道我該如何去做。

Attributes | DateTime 
A | 01/08/2017 00:01:45 
B | 03/08/2017 00:45:57 
A | 07/08/2017 13:00:00 

希望如果有人能建議我如何去做這件事。

在此先感謝。

回答

1

您可以使用LAG()比較到最後一個記錄:

SELECT p.* 
FROM(
    SELECT t.* 
      LAG(t.attributes) OVER(ORDER BY t.DateTime) as Last_Atrribute 
    FROM YourTable t) p 
WHERE p.attributes <> p.last_attribute 

如果你總是希望在第一條記錄,改變你的WHERE這樣:

WHERE p.attributes <> COALESCE(p.last_attribute,'-1') 

或者換句話說:

WHERE p.last_attribute IS NULL OR p.attributes <> p.last_attribute 

當然,您可以更改查詢以僅選擇預期的列umns。我使用了*星號。

0

使用LAG解析函數:

SELECT attributes, 
     datetime 
FROM (
    SELECT attributes, 
     datetime, 
     LAG(Attributes) OVER (ORDER BY DateTime) AS prev_attributes 
    FROM your_table 
) 
WHERE prev_attributes IS NULL 
OR  attributes <> prev_attributes 
+0

因爲你得到的評論在20秒後我張貼之前,我有在30秒後整理答案編輯....而且因爲SQL解析器應在一個語句中重複使用相同的函數調用的情況下,要足夠聰明以優化。 – MT0

+0

謝謝你一定會讓你知道我是如何得到的 – user3191160

+0

剛剛評論過你沒有注意到的情況。我知道你知道。雖然SQL解析器「應該」很聰明,但重複代碼更容易混淆,並可能導致更多錯誤,並且不保證聰明。 – sagi