Ниже приведен запрос BACKFILL , который даст желаемый результат.
Также следующий запрос требует меньше изменений при добавлении новых столбцов ex.status6, status7, status8, ...
«Добавить» и «или» в select добавляются, когда столбец требует ИСКЛЮЧЕНИЯ как status_4
И так как status_1 всегда равен 1, в вашем случае вы можете заменить (1 <= pos.one) на 1 </p>
with your_table(customerid,status_1,status_2,status_3,status_4,status_5) as (
select *
from (
values
('AX',1,0,0,0,0),
('BX',0,0,1,0,0),
('CX',0,0,0,0,1),
('DX',0,0,0,1,0),
('EX',0,1,0,0,0)
) t
)
select
customerid,
(1<=pos.one)::int as status1,
(2<=pos.one)::int as status2,
(3<=pos.one and pos.one!=4)::int as status3,
(4<=pos.one)::int as status4,
(5<=pos.one or pos.one=4)::int as status5
from
your_table t,
lateral
(
select position('1' in t.status_1::text||t.status_2||t.status_3||t.status_4||t.status_5) as one
) pos