Запрос для получения клиентов с более чем тремя просроченными книгами

Отберите невозвращённые выдачи с истёкшим сроком, сгруппируйте по клиенту и примените HAVING COUNT(*) > 3. Затем получите клиента и список книг.

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

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

Отберите невозвращённые выдачи с истёкшим сроком, сгруппируйте по клиенту и примените HAVING COUNT(*) > 3. Затем получите клиента и список книг.

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

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

Условие

Составьте SQL‑запрос, который вернёт всех клиентов, имеющих задолженность более трёх книг, а также их сведения и перечень этих книг.

Ответ

Отберите невозвращённые выдачи с истёкшим сроком, сгруппируйте по клиенту и примените HAVING COUNT(*) > 3. Затем получите клиента и список книг.

Схема не приведена, поэтому явно предположим customers(id, name), books(id, title), loans(customer_id, book_id, due_at, returned_at); одна строка loans — одна выданная книга.

SELECT c.id, c.name,
       jsonb_agg(jsonb_build_object(
           'id', b.id, 'title', b.title
       ) ORDER BY b.id) AS overdue_books
FROM customers c
JOIN loans l ON l.customer_id = c.id
JOIN books b ON b.id = l.book_id
WHERE l.returned_at IS NULL
  AND l.due_at < CURRENT_TIMESTAMP
GROUP BY c.id, c.name
HAVING COUNT(*) > 3;

Это PostgreSQL-вариант. При учёте нескольких экземпляров одного произведения список лучше включать с идентификатором выдачи или экземпляра. Если «задолженность» означает все невозвращённые книги, а не только просроченные, условие due_at убирают по бизнес-правилу.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее