Пример реализации для MySQL 8+:
WITH
cte1 AS ( SELECT id, col1 val FROM test UNION ALL
SELECT id, col2 FROM test UNION ALL
SELECT id, col3 FROM test ),
cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
FROM cte1
GROUP BY id )
SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
FROM test
JOIN cte2 cte2_1 USING (id)
JOIN cte2 cte2_2 USING (FIO)
GROUP BY test.id, test.col1, test.col2, test.col3
Вывод:
id col1 col2 col3 ids
1 Иванов Иван Иванович 1,2
2 Иван Иванович Иванов 1,2
3 Петров Сергей Алексеевич 3,4,5
4 Петров Сергей Алексеевич 3,4,5
5 Сергей Алексеевич Петров 3,4,5
DEMO
Если нужна ещё и нормализация (т.е. строго в col1 сунуть фамилию, в col2 имя...) - наилучшим вариантом считаю загрузку справочников имён, отчеств и фамилий (вполне доступные справочники) и их использование для категорирования. 99% записей будут полностью обработаны по ним, а оставшийся десяток записей (где два или все три значения отсутствуют в справочниках) можно и вручную обработать, вернее, пополнить справочник, чтобы при втором запуске все 100% были распознаны и категорированы корректно.
выполняться будет на MS SQL Server, версию не могу сказать.
Для MS SQL вместо
GROUP_CONCAT будет
STRING_AGG(column) [WITHIN GROUP ( ORDER BY column)].
https://docs.microsoft.com/ru-ru/sql/t-sql/functio...