Я думаю, вы в основном хотите:
with t as (
select t.*, row_number() over (order by id) as seqnum
from t
)
select t.place,
max(case when t2.place = 'A' then 1 else 0 end) as A,
max(case when t2.place = 'B' then 1 else 0 end) as B,
max(case when t2.place = 'C' then 1 else 0 end) as C,
max(case when t2.place = 'D' then 1 else 0 end) as D
from t join
t t2
on t.id = t2.id and t.seqnum <> t2.seqnum
group by t.place
order by t.place;
Это не совсем тот результат, который у вас есть в вопросе, но он, похоже, логически перекрывает перекрытия. Я не вижу, как у вас есть «A» / «A» с 1, но «C» / «C» с 0.