떠오른대로 해봤는데 되긴하네요.. 다른 방법이 있으면 알려주세요.
with t as (
select '홍길동' nm from dual union all
select '홍길동' from dual union all
select '김철수' from dual union all
select '이순신' from dual
)
select case when count(*) over (partition by nm) > 1 then nm||'_'||row_number() over (partition by nm order by null)
else nm end
from t