选择不同的行并包括非独特的标识符

时间:2017-09-21 13:36:20

标签: sql oracle

考虑如下表格。

ID  Value   Change_Date
1   A       1/1/2017
1   B       1/2/2017
1   B       1/3/2017
2   C       1/1/2017
2   C       1/3/2017
3   D       1/1/2017
3   E       1/3/2017
3   F       1/4/2017
3   D       1/10/2017

我想执行一个select语句,它有效地执行一个不同的,但包括distinct行的第一个按时间顺序排列的change_date值。所以上面的表格会被渲染成这样的东西:

ID  Value   Change_Date
1   A       1/1/2017
1   B       1/2/2017
2   C       1/1/2017
3   D       1/1/2017
3   E       1/3/2017
3   F       1/4/2017
3   D       1/10/2017

这在Oracle中是否可以远程实现?我正在尝试从审计表中清除一堆虚拟更新,但是需要change_date以便我可以显示它何时从值更改为值。像

这样的查询
select distinct id, value from my_table

显然会向我提供种子信息,但我需要将其与正确的日期联系起来。我可以使用this和min(change_date),但这意味着查询会看到id 3的第一行与id 3的最后一行相同,这是不正确的。

编辑:请注意,我不是在寻找ID和Value的简单区别。我还需要在切换回先前的值时也包含它,如ID 3所示。应该在输出中保留ID 3的所有四个值。

1 个答案:

答案 0 :(得分:1)

当多个id / value对在一行中时,您似乎只想要第一行。使用lag()

select t.*
from (select t.*,
             lag(value) over (partition by id order by change_date) as prev_value
      from t
     ) t
where prev_value is null or prev_value <> value;
相关问题