Корректность запросов

Гранулярность результата и уникальность ключа

Содержание курса

Как найти повторяющихся клиентов в результате

Чтобы проверить, действительно ли выбранный набор столбцов уникален в ответе, результат оборачивают в группировку с фильтром по количеству строк. Проверка ищет дубликаты:

-- Шаблон: замените заполнители своим запросом и столбцами ключа.
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 не встретился больше одного раза. Пустой ответ подтверждает только отсутствие дубликатов ключа в этих конкретных строках. Он не доказывает, что в отчёт попали все нужные клиенты и что суммы посчитаны без ошибок.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.