Мы с важной новостью: с 28 февраля 2025 года сервис Хабр Фриланс прекратит свою работу.

Купить услуги можно до 28 февраля 2025, но пополнить баланс уже нельзя. Если на вашем счете остались средства, вы можете потратить их на небольшие услуги — служба поддержки готова поделиться бонусами, на случай, если средств немного не хватает.
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