WITH order_customer_agg AS (
    SELECT shop_id,
           customer_name,
           product_name,
           SUM(quantity) AS sum_qty,
           SUM(quantity*unit_price) AS sum_amt,
           MIN(order_date) AS min_date
    FROM order_details
    GROUP BY shop_id,customer_name,product_name
),
order_product_agg AS (
    SELECT shop_id,
           product_name,
           SUM(sum_qty) AS total_qty,
           SUM(sum_amt) AS total_amt
    FROM order_customer_agg
    GROUP BY shop_id,product_name
)
SELECT c.shop_name,
       c.city,
       p.product_name AS top_product,
       p.product_revenue,
       o.customer_name AS top_customer,
       o.sum_qty AS customer_quantity,
       o.min_date AS first_purchase_date
FROM coffee_shops c 
JOIN LATERAL(
    SELECT p.shop_id,
           p.product_name,
           p.total_amt AS product_revenue
    FROM order_product_agg p 
    WHERE  c.shop_id=p.shop_id
    ORDER BY p.total_amt DESC,p.total_qty DESC,p.product_name ASC
    LIMIT 1
) p ON true
JOIN LATERAL(
    SELECT o.shop_id,
           o.product_name,
           o.customer_name,
           o.sum_qty,
           o.min_date
    FROM order_customer_agg o 
    WHERE c.shop_id=o.shop_id and p.product_name=o.product_name
    ORDER BY o.sum_qty DESC,o.min_date ASC,customer_name ASC
    LIMIT 1
) o ON true