Привет, будущие аналитики! С вами Евгений Буторин, ментор курса «Аналитик данных» и человек, который видел и писал слишком много странных SQL‑запросов, чтобы молчать об этом 😁
Сегодня разберём несколько типичных ошибок и недооценённых приёмов, которые встречаются даже у опытных аналитиков.
1️⃣ COUNT(*) vs COUNT(col)
Многие уверены, что
COUNT(*), COUNT(1) и COUNT(имя_столбца) — одно и то же. Но это не так.Предположим, что у нас есть таблица с пользователями, где указаны их имейлы. Если вы напишете:
SELECT COUNT(email) FROM users
то получите количество заполненных имейлов. То есть если у пользователя email равен
NULL, он не попадёт в подсчёт. А вот:SELECT COUNT(*) FROM users
Или
SELECT COUNT(1) FROM users
посчитают все строки.
Используйте
COUNT(имя_столбца), только если вам действительно нужно считать непустые значения, а не строки.2️⃣ Лишние поля в GROUP BY
Например, у вас есть таблица с транзакциями клиентов, в которой есть ID клиента, ID транзакции и её размер. Вам нужно считать общее количество транзакций на клиента.
Новички часто не понимают, как работает
GROUP BY и какие поля в нём указывать, поэтому часто можно встретить такое:SELECT client_id, sum(amount) as sum_amount
FROM transactions
GROUP BY client_id, transact_id
Данный скрипт отработает, но вместо одного
client_id у вас будет 10 строк (зависит от количества транзакций у клиента). Для того чтобы написать правильно, нужно указывать только те поля, которые есть в SELECT:SELECT client_id, sum(amount) as sum_amount
FROM transactions
GROUP BY client_id
3️⃣ Неверные поля в GROUP BY
Ещё одной частой ошибкой при использовании
GROUP BY является использование поля вместо условия. Например:SELECT client_id, case when start_date >= date’2026-01-01’ then 1 else 0 end as new_client_flag, sum(amount) as sum_amount
FROM transactions
GROUP BY client_id, start_date
Этот скрипт отработает, но сгруппирует неверно. Чтобы правильно сгруппировать строки, нужно использовать всё условие:
SELECT client_id, case when start_date >= date’2026-01-01’ then 1 else 0 end as new_client_flag, sum(amount) as sum_amount
FROM transactions
GROUP BY client_id, case when start_date >= date’2026-01-01’ then 1 else 0 end
4️⃣ LIKE без %
На работе нам часто приходится искать данные в текстовых полях. Например, мы отправляем SMS клиентам, но предварительно тестируем их. Заказчик просит нас собрать воронку. Поэтому нам нужно исключить тестовые записи.
Если мы напишем:
WHERE name NOT LIKE ‘test’
То получим только строгое соответствие, и как следствие, завышенный верх воронки. Поэтому для полноценного поиска нам нужно указывать:
WHERE name NOT LIKE ‘%test%’
Процент, поставленный до и после искомого слова, позволяет выбрать данные с любым количеством символов до и после.
5️⃣ DISTINCT не лечит дубли
Очень частая ошибка: «У меня дубли, добавлю
DISTINCT и всё». Но DISTINCT — это не всегда решение. Важно понимать причину дублей и использовать соответствующий метод дедупликации. Например:
SELECT DISTINCT u.client_id, t.amount
FROM clients u
LEFT JOIN transactions t ON u.client_id = t.client_id
Если у пользователя 10 транзакций, вы получите 10 строк.
DISTINCT оставит 10 строк, потому что amount разный.Правильный подход — агрегировать, суммируя amount:
SELECT u.client_id, SUM(t.amount) AS total_amount
FROM clients u
LEFT JOIN transactions t ON u.client_id = t.client_id
GROUP BY u.client_id
А какие ошибки вы совершали в начале своего пути? Делитесь, будем учиться вместе!
📊 Simulative