
Полная версия:
Глеб Зайцев DISTINCT в SQL. 18 задач про дубли и уникальность
- + Увеличить шрифт
- - Уменьшить шрифт

Глеб Зайцев
DISTINCT в SQL. 18 задач про дубли и уникальность
Перед первой задачей
Почему DISTINCT не должен быть кнопкой паники
Когда отчёт внезапно раздулся, рука тянется добавить DISTINCT. Иногда это правильно, но часто DISTINCT просто прячет проблему зерна или неправильного JOIN.
Уникальность всегда нужно формулировать явно: уникальные клиенты, уникальные SKU, уникальные пары клиент–товар или уникальные события по ключу.
Эта книга тренирует не только синтаксис DISTINCT, но и мышление вокруг дублей: где они допустимы, где опасны и когда их нельзя удалять без расследования.
Как читать задачи
Перед каждым запросом спросите себя: по каким колонкам мы считаем строки одинаковыми. DISTINCT сравнивает весь выбранный набор колонок.
Если нужно посчитать уникальные значения, используйте COUNT(DISTINCT ...). Если нужно выбрать представителя дублей, часто понадобится GROUP BY или отдельное правило.
Все запросы рассчитаны на SQLite. Базовые идеи DISTINCT, GROUP BY и проверки дублей полезны почти в любой SQL-системе.
Маршрут по задачам
1. Получить список клиентов с заказами
2. Посчитать число уникальных клиентов
3. Уникальные пары клиент и товар
4. Найти дубли SKU в справочнике
5. Не удалить реальные повторные покупки
6. Убрать повторные события одного типа
7. Посчитать уникальные товары в заказе
8. Отличить DISTINCT от GROUP BY
9. Дедуплицировать справочник перед JOIN
10. Найти конфликтующие названия SKU
11. Посчитать уникальные дни покупок
12. Уникальные каналы до расчёта отчёта
13. Убрать дубли после UNION
14. Сохранить дубли через UNION ALL
15. Проверить уникальность email
16. Сравнить число строк и число ключей
17. Найти повторные отправки промокода
18. Собрать финальный аудит каталога
Практические задачи
Задача 1. Получить список клиентов с заказами
Рабочий вопросНужно вывести каждого клиента один раз, даже если он сделал несколько заказов.
ДанныеCREATE TABLE orders(id INTEGER, client_id INTEGER);
INSERT INTO orders VALUES (1,10),(2,10),(3,20),(4,30),(5,20);
ЗапросSELECT DISTINCT client_id
FROM orders
ORDER BY client_id;
Ожидаемый результат[[10], [20], [30]]
Почему работаетDISTINCT оставляет уникальные значения client_id.
Повторные заказы клиента 10 превращаются в одну строку.
ORDER BY делает список удобным для проверки.
Где легко ошибитьсяЕсли добавить id заказа в SELECT, строки снова станут уникальными, потому что DISTINCT сравнивает весь выбранный набор колонок.
Самостоятельная проверкаПочему клиент 20 появляется один раз, хотя заказов у него два?
Ответ: Потому что в SELECT выбран только client_id, и DISTINCT убирает повтор этого значения.
Задача 2. Посчитать число уникальных клиентов
Рабочий вопросНужно получить одну цифру: сколько разных клиентов сделали хотя бы один заказ.
ДанныеCREATE TABLE orders(id INTEGER, client_id INTEGER);
INSERT INTO orders VALUES (1,10),(2,10),(3,20),(4,30),(5,20);
ЗапросSELECT COUNT(DISTINCT client_id) AS unique_clients
FROM orders;
Ожидаемый результат[[3]]
Почему работаетCOUNT(DISTINCT client_id) считает разные значения client_id.
Клиенты 10 и 20 имеют повторы, но учитываются по одному разу.
Итоговая цифра равна 3: 10, 20 и 30.
Где легко ошибитьсяCOUNT(*) здесь ответил бы на другой вопрос: сколько всего заказов, а не сколько уникальных клиентов.
Самостоятельная проверкаКакой результат дал бы COUNT(*) на этих данных?
Ответ: COUNT(*) дал бы 5, потому что в таблице пять строк заказов.
Задача 3. Уникальные пары клиент и товар
Рабочий вопросНужно понять, какие пары клиент–товар встречались хотя бы раз, без повторов покупок.
ДанныеCREATE TABLE purchases(id INTEGER, client_id INTEGER, sku TEXT);
INSERT INTO purchases VALUES (1,10,'A1'),(2,10,'A1'),(3,10,'B2'),(4,20,'A1');
ЗапросSELECT DISTINCT client_id, sku
FROM purchases
ORDER BY client_id, sku;
Ожидаемый результат[[10, "A1"], [10, "B2"], [20, "A1"]]
Почему работаетDISTINCT смотрит на пару выбранных колонок.
Две покупки 10-A1 превращаются в одну пару.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.





