要使用標準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