Для этого со стандартным 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