SELECT
    product_id,
    product_name,
    type,
    price
FROM
    (
        SELECT
            product_id,
            product_name,
            type,
            price,
            RANK() over (partition by type order by price DESC) AS rk
        FROM
            product_info
    ) p
WHERE
    rk <= 2
ORDER BY
    price DESC, 
    product_name
LIMIT 3

  1. 按名称进行排序,没说升序降序就不用写DESC或ASC
  2. 无法在 GROUP BY 后再“排序组内记录”,如果要在分组内排序只能用窗口函数ROW_NUMBER()/RANK() OVER(PARTITION BY ... ORDER BY ...)
  3. 窗口函数中排出的rk只能在子查询以外的where中进行调用,对子查询的结果进行过滤,不能在同一个子查询内使用
  4. 子查询的表一定要给名字