with t as(
 select city, c.customer_id, loan_amount, loan_type_name, t.loan_type_id
 from loan_applications a
 join customers c on a.customer_id = c.customer_id
join loan_application_types lat on a.application_id = lat.application_id
join loan_types t on lat.loan_type_id = t.loan_type_id
)


select  c.city, total_loan_amount, average_loan_amount, total_customers,
    loan_type_name 'most_applied_loan_type'

from (
    select city, round(sum(loan_amount), 2)'total_loan_amount', round(sum(loan_amount) / count(distinct customer_id),2)'average_loan_amount', count(distinct customer_id)'total_customers'
    from t
    group by city 
)a
join (

    select
        b.city, loan_type_name, row_number()over(PARTITION by b.city ORDER by cnt desc, loan_type_id asc)'rn'
        from(
            select city, count(*) 'cnt',loan_type_name, loan_type_id
            from t
            group by city, loan_type_name, loan_type_id
        )b
)c
on a.city = c.city
where rn = 1
ORDER by city asc;

第一步是join连接所有的表。

第二步:其次按照city进行分组,并依次计算total_loan_amount、average_loan_amount、total_customers等数据,值得注意的是,因为存在一个顾客有多次交易的情况,所有total_customers和average_loan_amount都需要 count(distinct customer_id)获取。

第三步:对于第一步获得的表,分组计算每个loan_type_name的数量,使用row_number()进行排序(相同的时候loan_type_id 取最小)

最后将第二步和第三步的表进行拼接,取rn=1即可获取要求的数据