Задачи с БД

1) Напишите код на GoLang с использованием PostgreSQL и оконных функций для того, чтобы найти для каждого клиента третий по величине заказ, сами придумайте структуру таблиц.

Для решения этой задачи сначала создадим структуру таблиц в PostgreSQL, а затем напишем код на GoLang для выполнения запроса с использованием оконных функций.

Шаг 1: Структура таблицы в PostgreSQL

Допустим, у нас есть таблица orders, которая содержит информацию о заказах клиентов. Вот пример структуры таблицы:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    client_id INT NOT NULL,
    order_value DECIMAL(10, 2) NOT NULL,
    order_date DATE NOT NULL
);

Шаг 2: SQL запрос с оконной функцией

Мы будем использовать оконную функцию ROW_NUMBER() для определения третьего по величине заказа для каждого клиента. Запрос будет выглядеть следующим образом:

SELECT client_id, order_value
FROM (
    SELECT client_id, order_value,
           ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY order_value DESC) as rn
    FROM orders
) as ranked_orders
WHERE rn = 3;

Шаг 3: Код на GoLang

Теперь напишем код на GoLang, который будет выполнять этот SQL-запрос и выводить результаты. Для работы с PostgreSQL мы будем использовать пакет github.com/lib/pq.

Этот код подключается к базе данных PostgreSQL, выполняет SQL-запрос с оконной функцией и выводит результаты. Убедитесь, что вы заменили параметры подключения к базе данных на свои собственные.

2) Есть база данных с такой схемой данных:

Необходимо составить SQL-запрос, чтобы выбрать уникальные комбинации пользователя и id товара (sku), для всех покупок, совершенных пользователем до того, как его забанили. Отсортировать сначала по имени пользователя, потом по SKU

Для выполнения этой задачи нам нужно составить SQL-запрос, который будет:

  1. Объединять таблицы user и purchase по user_id.

  2. Исключать покупки, совершенные после даты бана пользователя.

  3. Выбирать уникальные комбинации пользователя и SKU.

  4. Сортировать результаты по имени пользователя и SKU.

SQL-запрос

Объяснение запроса

  1. Объединение таблиц:

    Мы объединяем таблицы user и purchase по user_id, а также делаем левое соединение с таблицей ban_list, чтобы получить информацию о бане пользователя, если она существует.

  2. Фильтрация покупок:

    Мы исключаем покупки, совершенные после даты бана. Если пользователь не забанен (т.е. b.date_from IS NULL), то все его покупки включаются в результат. Если пользователь забанен, то включаются только те покупки, которые были совершены до даты бана.

  3. Выбор уникальных комбинаций:

    Мы выбираем уникальные комбинации пользователя и SKU, используя DISTINCT.

  4. Сортировка результатов:

    Мы сортируем результаты сначала по имени пользователя (u.firstname), а затем по SKU (p.sku).

Пример результата

Для приведенных данных результат запроса может выглядеть следующим образом:

Этот запрос обеспечивает выбор уникальных комбинаций пользователя и SKU для всех покупок, совершенных до даты бана, и сортирует результаты по имени пользователя и SKU.

Last updated