Check if this usage of LAG works for you:
drop table if exists #Temp
create table #Temp (ID int, PID int, PValue int, PTimestamp varchar(max) )
insert into #Temp values
( 1, 1, 0, 'datetime1' ),
( 2, 1, 1, 'datetime2' ),
( 3, 1, 1, 'datetime3' ),
( 4, 1, 0, 'datetime4' ),
( 5, 1, 0, 'datetime5' ),
( 6, 1, 1, 'datetime6' ),
( 7, 1, 1, 'datetime7' ),
( 8, 1, 1, 'datetime8' ),
( 9, 1, 0, 'datetime9' )
;
with D as
(
select *, lag(PValue) over (partition by PID order by ID) as PrevPValue
from #Temp
)
select ID, PID, PValue, PTimestamp
from D
where PValue <> PrevPValue
order by PID, ID
(In this sample timestamp is a string).