Отберите невозвращённые выдачи с истёкшим сроком, сгруппируйте по клиенту и примените 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 убирают по бизнес-правилу.