LEFT JOIN сохранит клиентов с пустой корзиной, а array_agg соберёт SKU в один массив. Пустую агрегацию замените на bigint[].
Электронные адреса пользователей и список SKU их корзин
LEFT JOIN сохранит клиентов с пустой корзиной, а array_agg соберёт SKU в один массив. Пустую агрегацию замените на bigint[].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе данных присутствуют две таблицы: public.customer и public.carts. Сформулируйте SQL‑запрос, который для каждого клиента выводит идентификатор, электронную почту и массив всех артикулов (sku), находящихся в его корзине, объединяя их в одну строку.
Table "public.carts"
+-------------+-----------------------------+-------------------------+
| Column | Type | Modifiers |
+-------------+-----------------------------+-------------------------+
| sku | bigint | not null |
| country | country_enum | not null |
| customer_id | bigint | not null |
| amount | bigint | not null |
| updated_at | timestamp without time zone | default now() not null |
+-------------+-----------------------------+-------------------------+
Table "public.customer"
+--------+------+----------+
| Column | Type | Modifiers |
+--------+------+----------+
| id | bigint | not null |
| email | text | not null |
+--------+------+----------+
Ответ
LEFT JOIN сохранит клиентов с пустой корзиной, а array_agg соберёт SKU в один массив. Пустую агрегацию замените на bigint[].
В PostgreSQL:
SELECT c.id, c.email,
COALESCE(
array_agg(cart.sku ORDER BY cart.sku, cart.country)
FILTER (WHERE cart.customer_id IS NOT NULL),
ARRAY[]::bigint[]
) AS skus
FROM public.customer c
LEFT JOIN public.carts cart ON cart.customer_id = c.id
GROUP BY c.id, c.email
ORDER BY c.id;
Здесь каждый ряд carts даёт один SKU независимо от amount; повторы между странами сохраняются. Если нужен набор уникальных артикулов, используйте array_agg(DISTINCT cart.sku ORDER BY cart.sku). Подразумевается уникальность customer.id: в показанной схеме отмечено только NOT NULL, поэтому уникальный ключ стоит закрепить отдельно. Для исключения пустых корзин замените LEFT JOIN на JOIN.