Условие
Напишите запрос, который выведет среднюю разницу в днях между первым и последним платежом
по закрытым кредитам. Ответ округляйте до целого.
Решение
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
