SQL查询语句
WITH RankedProducts AS (
SELECT
product_id,
category,
price,
views,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC, views DESC) AS rank
FROM
product
)
SELECT
product_id,
category,
price,
views
FROM
RankedProducts
WHERE
rank <= 5;
优化思路
- 窗口函数优化:使用窗口函数
ROW_NUMBER()
按类别分区,先按价格降序,再按浏览量降序排列,给每个产品在其所属类别内生成一个排名。这种方式避免了复杂的自连接操作,提高查询效率。
- CTE 提高可读性:通过公用表表达式(CTE)
RankedProducts
来封装窗口函数的结果,使主查询更简洁易懂,并且CTE在执行时会被优化器单独处理,可能会提高执行效率。
- 索引优化:如果表非常大,在
category
、price
和 views
字段上建立联合索引 (category, price DESC, views DESC)
,可以加速窗口函数中的排序操作,从而提升整体查询性能。