Как составить SQL-запрос с группировкой и условием по числу уникальных связанных записей?

Группировка в SQL с условием по уникальным связанным записям группировка результатов по основным полям с помощью GROUP BY подсчёт уникальных связанных значений через COUNT(DISTINCT related_column) отбор сформированных…

Короткий ответ

Что ответить на собеседовании

Группировка в SQL с условием по уникальным связанным записям группировка результатов по основным полям с помощью GROUP BY подсчёт уникальных связанных значений через COUNT(DISTINCT related_column) отбор сформированных групп с помощью HAVING (не через WHERE) пример:

Подробный разбор

Ответ с пояснениями

Группировка в SQL с условием по уникальным связанным записям

  • группировка результатов по основным полям с помощью GROUP BY
  • подсчёт уникальных связанных значений через COUNT(DISTINCT related_column)
  • отбор сформированных групп с помощью HAVING (не через WHERE)
  • пример:
SELECT main.id, COUNT(DISTINCT related.id) AS unique_count
FROM main
JOIN related ON related.main_id = main.id
GROUP BY main.id
HAVING COUNT(DISTINCT related.id) > n;

  • практическая задача: отбор записей по числу связей, например пользователей, создавших >=3 заказа

Подробный ответ

Основной ответ

Когда в SQL требуется сгруппировать данные и проверить количество уникальных связанных записей, обычно применяют агрегатную функцию COUNT(DISTINCT ...) в сочетании с GROUP BY и HAVING. Сначала строки объединяют по заданному признаку, затем подсчитывают уникальные связанные элементы и оставляют только те группы, число элементов в которых удовлетворяет условию.

Ключевые моменты

  • Группировка (GROUP BY) объединяет строки по одному или нескольким полям. Например, записи можно сгруппировать по идентификатору пользователя или категории.
  • Функция COUNT(DISTINCT column_name) определяет число различных значений внутри каждой группы. Это позволяет посчитать связанные записи без учёта повторов.
  • Клаузула HAVING фильтрует уже агрегированные группы по условию, заданному для количества уникальных записей. Например, так можно оставить только группы, содержащие больше N уникальных связанных элементов.

Пример

Предположим, таблица orders хранит заказы и содержит поля (order_id, customer_id). Чтобы выбрать клиентов, у которых более 3 уникальных заказов, можно использовать запрос следующего вида:

SELECT customer_id, COUNT(DISTINCT order_id) AS unique_orders
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT order_id) > 3;

Практический контекст

Подобная конструкция востребована при анализе пользовательского поведения: например, с её помощью можно найти клиентов с несколькими уникальными покупками или авторов с заданным числом уникальных публикаций. В PostgreSQL 14+ и MySQL 8+ этот подход хорошо масштабируется и работает эффективно при наличии подходящих индексов, например по customer_id и order_id.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку