Электронные адреса пользователей и список SKU их корзин

LEFT JOIN сохранит клиентов с пустой корзиной, а array_agg соберёт SKU в один массив. Пустую агрегацию замените на bigint[].

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

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

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.

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

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

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

Подробнее