考虑如下表格。
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的所有四个值。
答案 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;