select 
    c.shop_name,
    c.city,
    temp1.top_product,
    temp1.product_revenue,
    temp2.top_customer,
    temp2.customer_quantity,
    temp2.first_purchase_date
from coffee_shops c
    join lateral  
    (
        select 
            product_name as top_product,
            SUM(quantity * unit_price) as product_revenue
        from order_details o
        where c.shop_id=o.shop_id
        group by product_name
        order by product_revenue desc,SUM(quantity) desc,product_name 
        limit 1
    )temp1 on true
    join lateral 
    (
        select 
            customer_name as top_customer,
            SUM(quantity) as customer_quantity,
            min(order_date) as first_purchase_date
        from order_details o
        where o.shop_id=c.shop_id and temp1.top_product=o.product_name
        group by customer_name
        order by customer_quantity desc ,first_purchase_date,customer_name 
        limit 1
    )temp2 on true