Загрузка данных


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;