2017-09-06 60 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