Загрузка данных
SELECT
COUNT(*) OVER () AS Всего_строк,
FIO,
TIP,
PRIMER
FROM (
WITH a AS ( -- нормализация
SELECT
NAIMEN,
TRIM(REGEXP_REPLACE(
REPLACE(
REGEXP_REPLACE(REPLACE(UPPER(NAIMEN), 'Ё', 'Е'),
'[^А-ЯA-Z0-9.-]+', ' '),
'.', '. '),
' +', ' ')) AS S
FROM SH.UCH_VSE
WHERE NAIMEN IS NOT NULL
),
b AS ( -- срезаем служебные префиксы и суффиксы
SELECT
NAIMEN,
TRIM(REGEXP_REPLACE(
REGEXP_REPLACE(S,
'^(((КПП|ИНН) )?[0-9]+ |(КПП|ИНН|ПРЕДПРИНИМАТЕЛЬ[А-Я]*|ПБОЮЛ|ИП|ЧП|ФЛ|ГР\.|ГР|Г-Н) )+',
''),
'( (КПП|ИНН|ИП|ЧП|ПБОЮЛ|[0-9]+))+$',
'')) AS FIO
FROM a
),
c AS ( -- классификация формы записи
SELECT
NAIMEN,
FIO,
CASE
-- Фамилия Имя Отчество
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]{2,}(-[А-Я]{2,})* [А-Я]+(ИЧ|ВНА|ИЧНА)$')
THEN '1. Ф И О (с отчеством)'
-- Имя Отчество Фамилия
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]+(ИЧ|ВНА|ИЧНА) [А-Я]{2,}(-[А-Я]{2,})*$')
THEN '1. И О Ф (с отчеством)'
-- восточные: Алиев Расул Магомед оглы
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]{2,}(-[А-Я]{2,})*( [А-Я]{2,})? (ОГЛЫ|ОГЛУ|КЫЗЫ|УГЛИ|УУЛУ|ГЫЗЫ)$')
THEN '1. с ОГЛЫ/КЫЗЫ'
-- Фамилия + инициалы (с точками или без, 1-2 буквы)
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]\.? ?([А-Я]\.?)?$')
THEN '2. Фамилия + инициалы'
-- Инициалы + фамилия (2 инициала или 1 с точкой)
WHEN REGEXP_LIKE(FIO, '^[А-Я]\.? ?[А-Я]\.? [А-Я]{2,}(-[А-Я]{2,})*$')
OR REGEXP_LIKE(FIO, '^[А-Я]\. [А-Я]{2,}(-[А-Я]{2,})*$')
THEN '3. Инициалы + фамилия'
-- два слова: Фамилия Имя / Имя Фамилия
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]{2,}(-[А-Я]{2,})*$')
THEN CASE
WHEN REGEXP_LIKE(REGEXP_SUBSTR(FIO, '^[^ ]+'),
'(ОВ|ЕВ|ИН|ЫН|ЫХ|ИХ|СКИЙ|ЦКИЙ|СКАЯ|ЦКАЯ|ОЙ|ИЙ|ЫЙ|ОВА|ЕВА|ИНА|ЫНА|КО|УК|ЮК|АК|ЯК|ИК|ЕК|ИЧ|ЯН|ЯНЦ|ЦЕВ|ШВИЛИ|ДЗЕ|ЗАДЕ|А|Я|О|Е|И|У|Ю)$')
THEN '4. Два слова (вероятно Ф И)'
ELSE '5. Два слова (проверить)'
END
-- три слова без явного отчества
WHEN REGEXP_LIKE(FIO, '^[А-Я]{2,}(-[А-Я]{2,})* [А-Я]{2,}(-[А-Я]{2,})* [А-Я]{2,}(-[А-Я]{2,})*$')
THEN '6. Три слова (проверить)'
END AS TIP
FROM b
WHERE LENGTH(FIO) BETWEEN 4 AND 60
-- стоп-слова: только целые слова
AND NOT REGEXP_LIKE(FIO,
'(^| )(ООО|ОАО|ПАО|ЗАО|АО|ОДО|ОСБ|АКБ|КБ|ГУП|МУП|ФГУП|ФУ|УМП|ГП|НПФ|ЖСК|ТСЖ|ВДПО|ГМБХ|МИНФИН|МИНИСТЕРСТВО|'
|| 'СОФТ|МЭП|РУФПС|ПАЛАТА|ОАНО|УЗЕЛ|ФОНД|БАНК|СОЮЗ|ВКЛАДЫ|ГРАЖДАН|ОТД|МЕДИА|КЛУБ|РАЙПО|УСИБ|СЕТИ|СЧЕТ|ГРУППА|'
|| 'ФИЛИАЛ|ЗАВОД|ПАРТИЯ|БЮРО|СНГ|ДОМ|ФИН|АРТЕЛЬ|СИСТЕМС|СОДЕКСО|ЛИМИТЕД|ЦЕНТР|КОМБИНАТ|ХОЗЯЙСТВО|УЧАСТОК|ШАХТА|'
|| 'ДИСТАНЦИЯ|ЖИЛЬЕ|ГОРОД|СЕВЕР|ГОС|РАЙОН|ТУРИЗМ|ЕДИНИЦА|ТОВАРИЩЕСТВО|ПОДВОРЬЕ|ПОСОЛЬСТВО|КОНСУЛЬТАЦИЯ|РЕДАКЦИЯ|'
|| 'ГОСТИНИЦА|ОБЛПО|ЛИЦО|ЛИЦА|КОРПОРЕЙШН|ИНТЕРНЭШНЛ|ОБЪЕДИНЕНИЕ|ОТДЕЛЕНИЕ|З-Д|Ф-Л|Ф-Т|ХОЗ-ВО|ОБЩ-ВО|РОС-Я)'
|| '( |$)')
-- стоп-основы: начало слова (длинные основы, безопасно)
AND NOT REGEXP_LIKE(FIO,
'(^| )(ФЕДЕРАЛЬН|ГОСУДАРСТВЕН|МЕЖДУНАРОДН|ОРГАНИЗАЦИ|АДМИНИСТРАЦ|АДМИНИСТРАТИВ|УПРАВЛЕН|ДЕПАРТАМЕНТ|КОМИТЕТ|'
|| 'МИНИСТЕРСТВ|ПРЕДПРИЯТИ|ПРОИЗВОДСТВЕН|КОМПАНИ|КОРПОРАЦИ|ИНСТИТУТ|УНИВЕРСИТЕТ|ПОДРАЗДЕЛЕН|ПРЕДСТАВИТЕЛЬ|'
|| 'ПОЛИТИЧЕСК|НЕВЫЯСНЕН|ПАРТНЕР|ОБЪЕДИНЕН|ОБЩЕСТВ|РОССИЙСК|МОСКОВСК|ПТИЦЕФАБРИК|ФАБРИК|ЗАКРЫТ|ОТКРЫТ|АКЦИОНЕРН|'
|| 'ГЛАВН|МАШИНОСТРО|ИНДИВИДУАЛЬН|ЧАСТН|ЦЕНТРАЛЬН|КООПЕРАТИВ|СЕВЕРН|ЮЖНО-|КОНСУЛЬТАЦИ|ТОВАРИЩЕСТВ|ХОЗЯЙСТВ)')
)
SELECT FIO, TIP, MIN(NAIMEN) AS PRIMER
FROM c
WHERE TIP IS NOT NULL
GROUP BY FIO, TIP
)
ORDER BY TIP, FIO;