Найти в Дзене
Столяров Филипп

Middle задача из собеседований на должность разработчик БД (MS SQL)

Задание уровня middle (На понимание работы оконных функций)
Дана таблица:
transaction3 со столбцами
transaction_i -- ID транзакции
customer_id integer -- ID клиента
amount_rur -- сумма транзакции
success_flg -- флаг успешности транзакции
transaction_dt date -- дата и время транзакции Задание:
1) Вывести первую успешную транзакцию по каждому клиенту
2) После выполнения пункта 1, добавить условие: Cумма всех успешных транзакций клиента должна составлять больше 1000
На выходе вывести столбцы: transaction_id, customer_id, amount_rur, transaction_dt
Ответ к заданию
1) SELECT transaction_id, customer_id, amount_rur, transaction_dt
FROM
(SELECT ROW_NUMBER() over( Partition by customer_id ORDER BY transaction_id) as numtrans, transaction_id, customer_id, amount_rur, transaction_dt
FROM transaction as tr
WHERE success_flg = 1
) as tb1
WHERE numtrans = 1
2) SELECT transaction_id, customer_id, amount_rur, transaction_dt
FROM
(SELECT ROW_NUMBER() over( Partition by customer_id ORDER BY t

Задание уровня middle (На понимание работы оконных функций)

Дана таблица:
transaction3 со столбцами

transaction_i -- ID транзакции
customer_id integer -- ID клиента
amount_rur -- сумма транзакции
success_flg -- флаг успешности транзакции
transaction_dt date -- дата и время транзакции

Задание:
1) Вывести первую успешную транзакцию по каждому клиенту
2) После выполнения пункта 1, добавить условие: Cумма всех успешных транзакций клиента должна составлять больше 1000

На выходе вывести столбцы: transaction_id, customer_id, amount_rur, transaction_dt

Ответ к заданию

1)
SELECT transaction_id, customer_id, amount_rur, transaction_dt
FROM
(SELECT ROW_NUMBER() over( Partition by customer_id ORDER BY transaction_id) as numtrans, transaction_id, customer_id, amount_rur, transaction_dt
FROM transaction as tr
WHERE success_flg = 1
) as tb1
WHERE numtrans = 1


2) SELECT transaction_id, customer_id, amount_rur, transaction_dt
FROM
(SELECT ROW_NUMBER() over( Partition by customer_id ORDER BY transaction_id) as numtrans, transaction_id, customer_id, amount_rur, transaction_dt,
SUM (
amount_rur) over (Partition by customer_id) as total
FROM transaction3 as tr
WHERE success_flg = 1
) as tb1
WHERE numtrans = 1 and total >
1000

Решение с пояснением

-- Создаем таблицу с транзакциями
CREATE TABLE transaction3 (transaction_id INT, customer_id INT, amount_rur float, success_flg int, transaction_dt date);

-Заполняем таблицу данными
INSERT INTO transaction3 (transaction_id, customer_id, amount_rur, success_flg, transaction_dt)
VALUES

-- Клиент 1
(1, 101, 1200.50, 1, '2025-05-01'),
(2, 101, 850.00, 0, '2025-05-03'),
(3, 101, 300.75, 1, '2025-05-05'),

-- Клиент 2
(4, 102, 5000.00, 1, '2025-05-01'),
(6, 102, 2000.00, 1, '2025-05-04'),
(5, 102, 1500.00, 0, '2025-05-06'),

-- Клиент 3
(8, 103, 300.00, 1, '2025-05-02'),
(10, 103, 450.50, 0, '2025-05-03'),
(12, 103, 700.00, 1, '2025-05-07'),

-- Клиент 4
(11, 104, 1000.00, 1, '2025-05-01'),
(22, 104, 1100.00, 1, '2025-05-02'),
(33, 104, 900.00, 0, '2025-05-05');

Запускаем первый запрос и смотрим результат

Действительно, произошла сортировка транзакций в рамках окна клиента и отобразились только первые транзакции по каждому клиенту
Действительно, произошла сортировка транзакций в рамках окна клиента и отобразились только первые транзакции по каждому клиенту

Запускаем второй запрос и смотрим результат

По третьему клиенту сумма всех успешных транзакций составляет 1 000, что не является условию больше 1000. Поэтому он не вывелся, в вывелись первые транзакции по клиентам 1, 2 и 4
По третьему клиенту сумма всех успешных транзакций составляет 1 000, что не является условию больше 1000. Поэтому он не вывелся, в вывелись первые транзакции по клиентам 1, 2 и 4

Благодарю за прочтение!
По вопросам сотрудничества обращайтесь на почту: mypj@ya.ru