假设我在表格中有以下数据(表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
答案 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
。