要使用标准SQL执行此操作,可以使用相关子查询。这个想法是让以前的值只保留行与当前值是不同的:
select a.*
from (select t.*
(select max(id) from t t2 where t2.id < t.id) as pevid
from t
) a left outer join
t aprev
on a.previd = aprev.id
where aprev.value <> a.value or aprev.value is null
这真是lag()
功能的实现,但没有窗口的功能。
你也可以写这个使用上/极限/ ROWNUM和子查询这样的顺序:
select a.*
from (select t.*
(select top 1 id from t t2 where t2.id < t.id order by id desc) as pevid
from t
) a left outer join
t aprev
on a.previd = aprev.id
where aprev.value <> a.value or aprev.value is null
这反过来又可以简化为删除最后一个加入:
select a.*
from (select t.*
(select top 1 val from t t2 where t2.id < t.id order by id desc) as pevval
from t
)
where a.prevval <> a.value or a.prevval is null
什么平台? SQL Server? MySQL的?这可以使用窗口功能。 – NYCdotNet
也许类似于'SELECT id,value FROM table WHERE id IN(1,2,3,7,8,9,10,15,16);'? – Oldskool
我们正在使用MSSQL – pufferfish