Рассказываем про аналитику и менеджмент
По всем вопросам: @vice22821
Чат - @ProdAnalysis_chat
Основной канал – @postypashki_old
Post #68
3.04K

Задача из отбора на стажировку Мини-CEO в Т-банк
Условие
Напишите запрос, который выведет среднюю разницу в днях между первым и последним платежом
по закрытым кредитам. Ответ округляйте до целого.
Решение
0) Чтобы получить таблицу где будут кредиты и соответствующие им даты платежей делаем JOIN, по умолчанию функция JOIN работает как INNER JOIN
1) Для каждого кредита находим даты первого и последнего платежа — это можно сделать функциями MAX и MIN. Затем считаем их разницу, предварительно приведя
2) С помощью AVG усредняем эти разницы по всем закрытым кредитам и округляем до целого.
Когда я в первый раз решал задачу, система выдала вердикт Presentation Error — Ошибка неправильного формата. Первая версия моего кода выглядела так:
Ключевой момент в том, что столбец
Если мы приведем
@ProdAnalysis
Условие
Напишите запрос, который выведет среднюю разницу в днях между первым и последним платежом
по закрытым кредитам. Ответ округляйте до целого.
Решение
0) Чтобы получить таблицу где будут кредиты и соответствующие им даты платежей делаем JOIN, по умолчанию функция JOIN работает как INNER JOIN
1) Для каждого кредита находим даты первого и последнего платежа — это можно сделать функциями MAX и MIN. Затем считаем их разницу, предварительно приведя
p.payment_date из формата timestamp в date.2) С помощью AVG усредняем эти разницы по всем закрытым кредитам и округляем до целого.
Когда я в первый раз решал задачу, система выдала вердикт Presentation Error — Ошибка неправильного формата. Первая версия моего кода выглядела так:
SELECT ROUND(AVG(last_date - first_date))
FROM (
SELECT MIN(p.payment_date) AS first_date, MAX(p.payment_date) AS last_date
…
) AS diffs;
Ключевой момент в том, что столбец
p.payment_date имеет формат timestamp, разность таймстемпов даст интервал "XX days HH:MM:SS" (timestamp – timestamp = interval). AVG(interval) возвращает опять interval. Вызов ROUND(interval) не существует, значит результат будет в формате вида "42 days 11:23:58", которую система считывает, но она не совпадает с ожидаемым форматом (PE).Если мы приведем
payment_date к date, то разность дат даст целое число дней (date – date = integer). AVG(integer) вернет в этом случае numeric. Округляя среднее число дней ROUND(numeric) получим, то что от нас требовали.SELECT ROUND(AVG(day_diff))
FROM (
SELECT cr.credit_id, MAX(p.payment_date)::date - MIN(p.payment_date)::date AS day_diff
FROM credits AS cr
JOIN payments AS p ON cr.credit_id = p.credit_id
WHERE cr.status = 'closed'
GROUP BY cr.credit_id
) AS diffs;
@ProdAnalysis
- 👍 11
- ❤🔥 2
- ❤ 2









