Следующий запрос должен помочь.
SELECT
acc_id,
MAX(CASE WHEN credit_type = 'success' AND rn = 1 THEN credit_id END) as last_successfull_credit_id,
MAX(CASE WHEN credit_type = 'success' AND rn = 1 THEN cdate END) as last_successfull_credit_date,
MAX(CASE WHEN credit_type = 'success' AND rn = 1 THEN credit_amount END) as last_successfull_credit_amount,
SUM(CASE WHEN credit_type = 'failed' THEN credit_amount ELSE 0 END) total_amount_of_failed_credit,
SUM(CASE WHEN credit_type = 'failed' THEN 1 ELSE 0 END) / COUNT(*) ratio_success_request
FROM (
SELECT
a.acc_id,
a.cdate adate,
a.acc_type,
c.credit_id,
c.cdate,
c.credit_type,
c.credit_amount,
ROW_NUMBER() OVER(PARTITION BY c.acc_id, c.credit_type ORDER BY c.cdate DESC) rn
FROM
account a
LEFT JOIN credit_request c ON c.acc_id = a.acc_id
) x
GROUP BY acc_id
ORDER BY acc_id
Подзапрос присваивает последовательность каждой записи в группах счетов и типах кредитов, используя ROW_NUMBR()
.Внешний запрос выполняет условную агрегацию для вычисления различных вычислений, которые вы запрашивали.
Это Db Fiddle demo с вашими тестовыми данными:
ACC_ID | LAST_SUCCESSFULL_CREDIT_ID | LAST_SUCCESSFULL_CREDIT_DATE | LAST_SUCCESSFULL_CREDIT_AMOUNT | TOTAL_AMOUNT_OF_FAILED_CREDIT | RATIO_SUCCESS_REQUEST
-----: | -------------------------: | :--------------------------- | -----------------------------: | ----------------------------: | --------------------:
1 | <em>null</em> | <em>null</em> | <em>null</em> | 2200 | 1
2 | 1214 | 02-DEC-18 | 1500 | 3500 | .5
3 | <em>null</em> | <em>null</em> | <em>null</em> | 0 | 0
4 | 1312 | 03-NOV-18 | 8750 | 0 | 0
Это может быть то, что вы ищете ... Поскольку вы не показали ожидаемых результатов, это может быть не на 100% точно, не стесняйтесь адаптировать это.