R50 982f28ebe546cac6072f675c40243215
Аналитик данных

Стандартный sql-запрос

Добавлено 10 июл 2023 в 11:59
Необходимо составить SQL-запрос, чтобы получить таблицу с
полями:
● project - ID проекта и его название в одном поле через точку и пробел. Например: “15029. OVERWATCH”.
● successful_transactions - Число успешных платежей.
● successful_transactions_amount - Сумма успешных транзакций в у.е..
● average_check - Средний чек в проекте в у.е. (не медиана, а просто AVG от всех успешных платежей)
● max_amount_for_1_user - Максимальная сумма платежей для одного пользователя в заданном периоде в
у.е.
● TOP3_most_popular_ps - 3 самые популярные платежные системы в проекте по числу успешных платежей.
● TOP3_banks - 3 самых популярных банка по числу успешных платежей в проекте
Тестовые транзакции из всех выборок придется исключить.
Имеющиеся таблицы:
● Payments
○ id - Уникальный номер платежа
○ payment_date - Дата совершения платежа
○ nick - Идентификатор пользователя
○ payment_account - Идентификатор платежного аккаунта
○ project_id - ID проекта в системе
○ status - статус платежа в системе
1 - транзакция в процессе обработки
2 - транзакция отменена
3 - транзакция успешна
○ amount - Сумма текущей транзакции в у.е.
○ payment_system - Используемый платежный метод
○ test_transaction - Флаг, является ли транзакция тестовой или нет.
(1 - тест, 0 - бой)
● Card_payments
○ payment_id - ID из таблицы Payments
○ card_brand - Тип карты
○ card_bank - Банк, выпустивший карту
● Games
○ game_id - Соответствует project из таблицы payments
○ game_name - Полное название игры
○ additional_settings - Строка дополнительных настроек проекта

Итоговый резузльтат:
--Для написания запроса используется диалект PostgreSQL
--Принимается то что test_transaction целочисленное значение, если булевое, то 0 - заменяется на FALSE, 1 - заменяется на TRUE
-- Для работы данного запроса нужно проверить формат даты в БД
-- Можно добавить для данного запроса: сортировка по дате получения информации P.S не было добавлено тк не указано в ТЗ

-- Таблица для расчёта показателей внутри проекта
WITH succes_pay AS (
SELECT project_id,
COUNT(id) AS successful_transactions,
SUM(amount) AS successful_transactions_amount,
AVG(amount) AS average_check
FROM Payments
WHERE test_transaction = 0 AND status = 3
GROUP BY project_id
),
-- Максимальная сумма платежей для одного поьзователя в указанный период
max_amount_1user AS (
SELECT
nick,
SUM(amount) AS max_amount_for_1_user
FROM Payments
WHERE test_transaction = 0 AND status = 3
AND payment_date BETWEEN '2023-06-01' AND '2024-06-01'
GROUP BY nick
ORDER BY 2 DESC
LIMIT 1
),
-- Таблица с получением информации о 3 самых популярных платежных системах в одном проекте
top_3_system_pay AS (SELECT project_id, string_agg(payment_system,',') AS TOP3_most_popular_ps
FROM (SELECT *
FROM (SELECT project_id,payment_system,count_sys,
ROW_NUMBER() OVER (PARTITION BY project_id ORDER BY count_sys desc) AS row_num
FROM (SELECT project_id,payment_system,COUNT(id) AS count_sys
FROM Payments
WHERE status = 3 AND test_transaction = 0
GROUP BY project_id,payment_system
ORDER BY 1,2 DESC) AS pay_system_project) AS pay_sys_2
WHERE row_num < 4) AS final_top_system
GROUP BY project_id),
-- Таблица с 3-мя самыми популярными банками в проекте
top_3_bank_project AS (SELECT project_id, string_agg(card_bank,',') AS TOP3_banks
FROM (SELECT project_id,card_bank,
ROW_NUMBER() OVER(PARTITION BY project_id ORDER BY count_pay_bank desc) AS row_numer
FROM (SELECT p.project_id, cp.card_bank, COUNT(p.id) AS count_pay_bank
FROM Payments AS p
LEFT JOIN Card_payments AS cp
ON p.id = cp.payment_id
WHERE p.test_transaction = 0 AND p.status = 3
GROUP BY p.project_id, cp.card_bank
ORDER BY 1,2 DESC) AS bank_pay_top) AS bank_top_sort
WHERE row_numer < 4
GROUP BY project_id),
-- Соедение таблиц показателей внутри проекта и макс.суммы пользователя
combined AS (
SELECT project_id,successful_transactions,successful_transactions_amount,average_check,max_amount_for_1_user
FROM succes_pay
CROSS JOIN max_amount_1user
),
-- присоеденение информации о топ 3 банках и системах
full_joined AS (SELECT c.project_id,successful_transactions,
successful_transactions_amount,average_check,max_amount_for_1_user,TOP3_most_popular_ps,TOP3_banks
FROM combined AS c
LEFT JOIN top_3_system_pay AS t3s
ON c.project_id = t3s.project_id
LEFT JOIN top_3_bank_project AS t3b
ON c.project_id = t3b.project_id),
-- запрос для получения кода и названия проекта
concat_final AS (SELECT CONCAT(fj.project_id, '. ',g.game_name) AS project,successful_transactions,
successful_transactions_amount,average_check,max_amount_for_1_user,TOP3_most_popular_ps,TOP3_banks
FROM full_joined AS fj
LEFT JOIN Games AS g
ON fj.project_id = g.game_id)
SELECT *
FROM concat_final
E4b01cacb4