TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #1265 2.67K
🧠 Ситуация

У тебя есть старая таблица пользователей:

users_old
---------
id
full_name -- "Ivan Petrov"
email
created_at


Новая схема БД требует нормализации:

users
------
id
first_name
last_name
email
created_at

profiles
--------
user_id
display_name -- оригинальное полное имя

⚠️ Проблема

В full_name данные грязные:

full_name
Ivan Petrov
Maria
John Smith Jr.
Anna-Marie Watson
Dmitry Ivanov
NULL
"" (пустая строка)

Требования миграции:

• Разбить имя на first_name и last_name

• Если фамилии нет → last_name = NULL

• Лишние пробелы убрать

• Суффиксы типа Jr. считать частью фамилии

• Пустые и NULL имена → first_name = 'Unknown'

• Оригинал имени сохранить в profiles.display_name

Миграция должна работать одним SQL-скриптом без Python

🎯 Задача

• Напиши SQL-миграцию, которая:

• Переносит данные из users_old в users

• Создаёт записи в profiles

• Чистит имя

• Работает корректно со всеми кейсами

💣 Усложнение (вот где ловушка)

• Таблица 10 млн строк, нельзя:

• Делать UPDATE по одной строке

• Использовать курсоры

• Только set-based SQL.

💡 Ожидаемое решение (PostgreSQL)
INSERT INTO users (id, first_name, last_name, email, created_at)
SELECT
id,

-- first_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN 'Unknown'
ELSE split_part(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' ', 1)
END,

-- last_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN NULL
WHEN array_length(string_to_array(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' '), 1) = 1
THEN NULL
ELSE substring(
TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))
FROM position(' ' IN TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))) + 1
)
END,

email,
created_at
FROM users_old;


INSERT INTO profiles (user_id, display_name)
SELECT
id,
NULLIF(TRIM(full_name), '')
FROM users_old;


Задача проверяет:
• работу со строками
• regexp_replace
• split_part
• edge cases
• производительность (set-based)
• реальную миграцию, а не учебный select
  • 👍 6
  • 🔥 2
  • ❤ 1
More from @databases_tg
  1. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  2. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
  3. Sep 25, 2026Как облегчить работу ИТ-аналитика уже сейчас — без долгосрочных перестроек процессов? Обсу…
  4. Sep 24, 2026🐧 Linux Cheat Sheet - шпаргалка по командам Linux Самая удобная шпаргалка по Linux и Bash…
  5. Sep 23, 2026⚡️ SQL-задача с подвохом Что вернёт этот запрос в PostgreSQL? CREATE TABLE payments ( id i…
  6. Sep 17, 2026🖥 Race condition в SQL: как продать последний товар дважды? Race condition в SQL: Дио и Д…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →