with full_tb as(
    select 
        city,
        lt.loan_type_name,
        lt.loan_type_id,
        loan_amount,
        c.customer_name
    from 
        customers as c 
        left join loan_applications as la on c.customer_id = la.customer_id
        left join loan_application_types as lat on la.application_id = lat.application_id
        inner join loan_types as lt on lat.loan_type_id = lt.loan_type_id
),
right_part as(
    select
        city,
        loan_type_name as most_applied_loan_type
    from
        (
            select
                city,
                loan_type_name,
                type_total_customers,
                row_number() over(partition by city order by type_total_customers desc, loan_type_id) as ranking
            from 
                (
                    select 
                        city,
                        loan_type_id,
                        loan_type_name,
                        sum(loan_amount) as type_total_loan_amount,
                        count(customer_name) as type_total_customers
                    from full_tb
                    group by city, loan_type_id, loan_type_name
                ) as tmp
        ) as ranking_tb
    where ranking = 1
),
left_part as(
    select
        city,
        sum(loan_amount) as total_loan_amount,
        round(sum(loan_amount) / count(distinct customer_name), 2) as average_loan_amount,
        count(distinct(customer_name)) as total_customers
    from full_tb
    group by city
)


select 
    left_part.city as city,
    total_loan_amount,
    average_loan_amount,
    total_customers,
    most_applied_loan_type
from 
    right_part
    inner join left_part on right_part.city = left_part.city
order by city;