Использование «FIRST_VALUE» дает вам изменение, но можете ли вы рассчитывать, что в таблице будет только одно изменение? Разве другие изменения не сделают это недействительным и не приведут ли к неверным данным?
Вместо этого я использовал функцию LAG, но она не возвращает IDCONT C, поскольку в ней не было изменений.
Использование CTE для захвата данных и последующего запроса к фильтру может быть быстрее (поскольку вы не можете поместить LAG или FIRST_VALUE в предложение where). Это предотвратит очередную поездку в базу данных.
CREATE TABLE REFTABLE
([PROCESSID] int, [IDCONT] varchar(1), [STATEID] varchar(1), [DAY_ID] int)
;
INSERT INTO REFTABLE
([PROCESSID], [IDCONT], [STATEID], [DAY_ID])
VALUES
(1, 'A', 'X', 10),
(2, 'A', 'X', 11),
(3, 'A', 'Y', 12),
(4, 'A', 'Y', 13),
(1, 'B', 'N', 14),
(2, 'B', 'N', 15),
(3, 'B', 'M', 16),
(1, 'C', 'X', 11),
(2, 'C', 'X', 18)
;
with chgfound as (SELECT TOP 100 PERCENT PROCESSID, IDCONT, STATEID, DAY_ID, LAG(STATEID) OVER(PARTITION BY IDCONT ORDER BY IDCONT, PROCESSID) as LastState
from REFTABLE
order by IDCONT, PROCESSID
)
select * from chgfound where STATEID !=LastState
http://www.sqlfiddle.com/#!18/086134
Также только что заметил, что у вас есть тег Oracle. Я сделал это в SQL Server, но он должен быть очень похожим.