使用数据跟踪Oracle SQL中的更改

时间:2017-09-06 11:39:08

标签: sql oracle

我正在寻找如何跟踪我所拥有的表中的值更改,因为我目前希望能够捕获该属性的第一个日期,但如果我有一个属性A变为属性B的场景,则会失败几天后,然后在几周后再次回到属性A.

以下是我的数据集:

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

如果有人可以建议我如何做这件事,我将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分: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

当然,您可以更改查询以仅选择预期的列。我使用了*星号。

答案 1 :(得分: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