Я бы использовал row_number()
и агрегацию. Вот один метод, использующий union all
:
select item, group, max(char1), max(char2), max(char3)
from ((select item, group, char1, null as char2, null as char3
row_number() over (partition by item, group order by char1) as seqnum
from t
where char1 is not null
) union all
(select item, group, char1, char2, null as char3
row_number() over (partition by item, group order by char2) as seqnum
from t
where char2 is not null
) union all
(select item, group, null as char1, null as char2, char3
row_number() over (partition by item, group order by char3) as seqnum
from t
where char3 is not null
)
) t
group by item, group, seqnum