You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL窗口函数vs GROUP BY:各品类最大折扣商品正确查询

查询每个品类中折扣最大且ID最小的商品

需求说明:
某百货商店拥有CUSTOMER、PRODUCT、PURCHASE三张表,分别存储顾客、商品、购买记录数据。需要查询每个品类中折扣力度最大的商品,要求按品类升序输出品类(category)、商品ID(product_id)、该商品的折扣(discount)。若同一品类中有多个商品折扣相同且为最大值,需输出商品ID最小的商品。

正确实现语句

使用窗口函数row_number()可以精准实现需求:

with ranked_discount as (
    select p.category,
         p.product_id,
         p.discount,
         row_number() over (partition by category ORDER BY discount DESC, product_id ASC) as rn_disc
     FROM Product as p
) select category, product_id, discount from ranked_discount where rn_disc = 1

逻辑说明:通过partition by category按品类分组,在每组内先按折扣降序排序,折扣相同时按商品ID升序排序,row_number()会给每组内符合要求的商品标记为1,最后筛选出标记为1的记录即可。

错误实现语句

以下语句无法满足需求:

select category, product_id, MAX(discount)
FROM Product
GROUP BY category, product_id
ORDER BY category ASC

错误原因

该语句的GROUP BY category, product_id是将每个商品作为单独分组,MAX(discount)实际返回的就是每个商品自身的折扣,完全没有实现“每个品类取最大折扣商品”的逻辑。即便忽略这一点,当同一品类存在多个折扣相同的最大值商品时,该语句会把所有这些商品都返回,无法筛选出其中商品ID最小的那个,不符合需求要求。

内容的提问来源于stack exchange,提问作者Jwan622

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:58:15