如果从以前更改了列值(MS SQL SERVER)

时间:2015-11-18 11:38:21

标签: sql sql-server sql-server-2008

假设我在表格中有以下数据(表1)

id       Time
1        15/06/2012 8:03:43 PM 
1        15/06/2012 8:03:48 PM 
1        15/06/2012 8:03:53 PM
1        15/06/2012 8:03:58 PM     
2        15/06/2012 8:04:03 PM 
2        15/06/2012 8:04:08 PM
3        15/06/2012 8:04:13 PM 
3        15/06/2012 8:04:18 PM
3        15/06/2012 8:04:23 PM
2        15/06/2012 8:04:03 PM 
2        15/06/2012 8:04:03 PM 

我可以获得列值已更改的行(仅适用于列ID)。我想要以下结果

 id    time
-----  -----------------------
1      2012-06-15 20:03:43.000
2      2012-06-15 20:04:03.000
3      2012-06-15 20:04:13.000
2      2012-06-15 20:04:03.000

2 个答案:

答案 0 :(得分:1)

这显然无法解答您的问题,因为您使用的是SQL Server 2008,但是,对于其他用户,我想在Sql Server 2012及更高版本中使用滞后函数添加解决方案示例。

select id,[time] from ( 
    select 
        *,
        lag(id,1) over (order by (select 'constant')) as previousId
    from table1
) t 
where id <> previousId or previousId is null

如其他地方所述,您应该有一个可以排序的列,并用该列替换(select 'constant')。即order by insertDate

答案 1 :(得分:0)

假设意图是按时间对数据进行排序(这与数据的显示方式不完全相同),那么您可以这样做。在SQL Server 2012+中,您将使用lag()。在早期版本中,您可以使用outer apply获得相同的效果:

select t.*
from table1 t outer apply
     (select top 1 t2.*
      from table1 t2
      where t2.time < t.time
      order by t2.time desc
     ) tprev
where tprev.id is null or tprev.id <> t.id;

当然,如果另一列指定了排序,那么您可以使用它而不是time