SQL如何筛选列中的更改

时间:2014-06-13 08:17:39

标签: sql

我的问题如下:

ID   Value   Date
---------------------------------
ID1    1     2014.03.03
ID2    1     2014.03.04    
ID1    2     2014.03.04  
ID3    1     2014.03.04  
ID2    1     2014.03.05  
ID2    1     2014.03.05   
ID1    2     2014.03.05    
ID1    2     2014.03.05
ID1    2     2014.03.05
ID1    1     2014.03.05
ID1    3     2014.03.05

我想要以下输出:

ID   Value   Date
---------------------------------
ID1    1     2014.03.03    
ID1    2     2014.03.04  
ID3    1     2014.03.04  
ID2    1     2014.03.05 
ID1    1     2014.03.05  
ID1    3     2014.03.05

因此,如果ID1的值为1,我只想获得一次(日期并不重要,它可能是最新的或最旧的)。但是如果值改变(甚至是更早的值),我想将它写入输出。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您没有说明您的DBMS,因此这是ANSI SQL。

这样的事情可能会:

select id, value, date
from (
   select id, value, date, 
          lag(value) over (order by id, date) as prev_value
   from the_table
) t
where value <> prev_value
order by id, value;

它选择列value中的值(btw:列的可怕名称)与上一行中该列的值不同的所有行。

答案 1 :(得分:-1)

尝试使用DISTINCT。

Select distinct ID, Value, Date From YOUR_TABLE

因此,对于元组,如果所有3列的数据都具有相同的值,则它将仅显示一个数据实例。但是,如果其中一列有不同的数据,它会认为它与之前的不同,并在输出中加密。