An SQL query to derive data from one to many rows based on another field
As far as I can tell, you want the "first" non-null value for the c3 column for the "group" that is defined through the c2 column.

This can be done with a window function:

select c1, 
       c2, 
       first_value(c3) over (partition by c2 order by c3 nulls last) as c3
from table_1


This does return the result you showed us.

Edit (after the question was changed)

To update the existing values you can use this:

update t1
  set c3 = tu.c3
from (
  select c1, c2, first_value(c3) over (partition by c2 order by c3 nulls last) as c3
  from t1
) tu
where t1.c1 = tu.c1
  and t1.c3 is null;