销售分析一:总销售额最高的销售员(含并列)
LeetCode 1082 · 分组求和、聚合结果上开窗
面试怎么回答
GROUP BY seller_id 求 SUM(price),同一层用 RANK() OVER (ORDER BY SUM(price) DESC) 排名,外层取 rk = 1。窗口函数在分组之后执行,所以可以对聚合值开窗,并列最高的销售员都会返回。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
销售表记录每笔销售的销售员、产品、数量和金额。找出总销售额最高的销售员,并列的都输出。
表结构
- Product:product_id(主键)、product_name、unit_price
- Sales:seller_id、product_id、buyer_id、sale_date、quantity、price;没有主键,可能有重复行
思路
按销售员分组求和,再在分组结果上用 RANK 排名。窗口函数可以直接写在聚合查询里,RANK() OVER (ORDER BY SUM(price) DESC) 会在 GROUP BY 之后执行,对每个分组的合计排名。
参考解法
select seller_id
from (
select seller_id ,sum(price) tp,rank() over(order by sum(price) desc) rk
from Sales
group by seller_id
)t1
where rk =1
易错点
- 窗口函数在 GROUP BY 之后执行,所以 OVER 里可以用聚合函数;反过来 WHERE 里不能用窗口函数。
- 销售表允许重复行,重复的销售记录也是真实销售,不要去重。