Строковые функции SQL: TRIM, LOWER, SPLIT_PART и нормализация текста
Как очищать и разбирать строки в SQL: пробелы, регистр, email, UTM-метки и выделение частей текста для аналитических витрин.
Содержание статьи
Органический канал может приехать как Organic, organic и « organic ». Один и тот же домен окажется в нескольких группах, а email с разным регистром создаст двух пользователей в отчёте. Строковые функции помогают исправить представление, но не заменяют правила идентичности. Разберём вопрос на одном запросе: Как привести текстовые поля к единому виду, чтобы сегменты не раздвоились?
Сначала определим задачу
Как привести текстовые поля к единому виду, чтобы сегменты не раздвоились?
UTM source может содержать параметры и хвосты, а email — пробелы после копирования. Приведи source к lower(trim(source)), но не удаляй всё после символа без проверки: в URL это может быть значимая часть. Для домена отдели canonicalization от простого форматирования.
Используй простые функции для повторяемых правил и документируй преобразование. Если нормализация влияет на идентичность, согласуй её с владельцем данных. Сохраняй raw и normalized рядом — это небольшая цена за воспроизводимый аудит.
Как работает конструкция
TRIM убирает пробелы по краям, LOWER и UPPER приводят регистр, REPLACE заменяет фрагменты, а SPLIT_PART выделяет часть строки по разделителю. В PostgreSQL regexp_replace решает более сложные шаблоны. Нормализацию лучше делать до GROUP BY и сохранять исходное значение для аудита.
Собери пары raw_value → normalized_value и посмотри самые частые преобразования. Добавь quality_flag для пустых и подозрительных строк. Группируй по нормализованному полю, а в отчёте показывай охват и количество исправленных значений.
- Зафиксируй одну строку результата.
- Отдели условия по исходным строкам от условий по рассчитанным значениям.
- Назови период, ключи связи и правило для повторов.
Запрос по шагам
Названия таблиц здесь условные. При переносе сохрани зерно и бизнес-условия, а не буквальный синтаксис примера.
SELECT raw_channel, LOWER(TRIM(raw_channel)) AS channel,
SPLIT_PART(LOWER(TRIM(landing_url)), '?', 1) AS landing_path,
COUNT(*) AS sessions
FROM sessions GROUP BY 1, 2, 3 ORDER BY sessions DESC;Проверка результата
Собери пять-десять строк, где ответ можно получить вручную. Добавь NULL, дубль, объект без связанной записи и значение на границе периода. Затем сравни число строк и уникальных ключей до и после спорного шага.
Выполненный без ошибки запрос ещё не является правильным. Другой аналитик должен суметь восстановить из него источник, фильтр, grain и ожидаемое поведение на крайних случаях.
| Функция | Что делает | Пример |
|---|---|---|
| TRIM | убирает крайние пробелы | TRIM(channel) |
| LOWER | приводит регистр | LOWER(email) |
| REPLACE | заменяет фрагмент | REPLACE(phone, ...) |
| SPLIT_PART | берёт часть по разделителю | SPLIT_PART(url, ?, 1) |
Границы и альтернативы
LOWER не решает транслитерацию и не делает разные сущности одинаковыми. TRIM не убирает невидимые символы во всех случаях. SPLIT_PART с отсутствующим разделителем возвращает исходную строку. Не перезаписывай raw-значение.
Используй простые функции для повторяемых правил и документируй преобразование. Если нормализация влияет на идентичность, согласуй её с владельцем данных. Сохраняй raw и normalized рядом — это небольшая цена за воспроизводимый аудит.
Один raw-поток может распасться на варианты из-за регистра и пробелов.
Задание для самостоятельной проверки
Сделай витрину каналов из raw_channel, normalized_channel и normalization_rule. Найди долю строк, где значение изменилось. Для email проверь дубли до и после lower/trim и отдельно обсуди, можно ли считать совпавшие адреса одним пользователем.
- Сначала запиши ожидаемый результат словами.
- Проверь запрос на маленькой контрольной выборке.
- Объясни, что запрос считает и чего не доказывает.
Решение для команды
Используй простые функции для повторяемых правил и документируй преобразование. Если нормализация влияет на идентичность, согласуй её с владельцем данных. Сохраняй raw и normalized рядом — это небольшая цена за воспроизводимый аудит.
Материалы по теме
Собеседование аналитика данных: 30 задач и как решать их вслух
Большой практический гайд по собеседованию аналитика данных: SQL, Python, метрики, статистика, кейсы, дашборды и ответы, которые показывают ход мышления.
Порядок выполнения SQL-запроса: почему WHERE не видит alias из SELECT
Разбираем логический порядок выполнения SQL-запроса: FROM, WHERE, GROUP BY, HAVING, SELECT и ORDER BY. Примеры помогают понять ошибки alias и агрегации.
ORDER BY, LIMIT и OFFSET в SQL: сортировка и пагинация без ошибок
Как сортировать данные в SQL, выбирать top-N, строить стабильную пагинацию и не терять строки при одинаковых значениях.