Гранулярность результата и уникальность ключа
Содержание курса
Как найти повторяющихся клиентов в результате
Чтобы проверить, действительно ли выбранный набор столбцов уникален в ответе, результат оборачивают в группировку с фильтром по количеству строк. Проверка ищет дубликаты:
-- Шаблон: замените заполнители своим запросом и столбцами ключа.
SELECT <ключевые столбцы>, COUNT(*) AS cnt
FROM <результат>
GROUP BY <ключевые столбцы>
HAVING COUNT(*) > 1;
Если запрос не вернул ни одной строки, на проверяемом наборе повторов ключа нет. Если вернул — гранулярность нарушена.
Проверим промежуточный JOIN из первого примера, если от него ожидали отчёт «одна строка на клиента»:
WITH report AS (
SELECT c.client_id, o.total
FROM clients c
JOIN orders o ON o.client_id = c.client_id
)
SELECT client_id, COUNT(*) AS cnt
FROM report
GROUP BY client_id
HAVING COUNT(*) > 1;
Результат проверки:
| client_id | cnt |
|---|---|
| 1 | 2 |
Запрос сразу нашёл ошибку: у клиента 1 две строки вместо одной, потому что JOIN размножил клиента по числу его заказов.
Теперь проверим итоговый запрос с группировкой по клиенту. Эту же проверку можно записать через подзапрос в блоке FROM:
SELECT client_id, COUNT(*) AS cnt
FROM (
SELECT client_id, SUM(total) AS total_spent
FROM orders
GROUP BY client_id
) report
GROUP BY client_id
HAVING COUNT(*) > 1;
Результат пуст: ни один client_id не встретился больше одного раза. Пустой ответ подтверждает только отсутствие дубликатов ключа в этих конкретных строках. Он не доказывает, что в отчёт попали все нужные клиенты и что суммы посчитаны без ошибок.
