You can for example split your table

, then fill in missing based on the % column and finally update the values to your original table. And there are many ways of doing this filling, one option is via JSL and data table subscripting
Names Default To Here(1);
dt = Datatable("BD");
dt_split = dt << Split(
Split By(:Ref),
Split(:"% UPDATED"n),
Group(:Ref, :"%"n),
Output Table("Split of BD by Ref"),
Sort by Column Property,
Invisible
);
cont_cols = dt_split << Get Column Names("String", "Continuous");
Remove From(cont_cols, 1); // drop %
perc_vals = dt_split[0, "%"];
For Each({cont_col}, cont_cols,
perc_vals_current = perc_vals;
non_missing = dt_split << Get Rows Where(!IsMissing(As Column(dt_split, cont_col)));
perc_vals_current[non_missing] = dt_split[non_missing, cont_col];
dt_split[0, cont_col] = perc_vals_current
);
dt << Update(
With(dt_split),
Match Columns(:Ref = :Ref),
Replace Columns in Main Table(None)
);
Close(dt_split, no save);

-Jarmo