with
    t as (
        select
            product_id,
            product_name,
            type,
            price,
            rank() over (
                Partition by
                    type
                order by
                    price DESC
            ) as rk
        from
            product_info
        group by
            type,
            product_id
    )
select
    product_id,
    product_name,
    type,
    price
from
    t
where
    rk <= 2
order by
    price desc,
    product_name asc
limit
    3;