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;