订阅更新

销售分析一:总销售额最高的销售员(含并列)

SQL 实战 123 题 · 第 55 题 简单 约 2 分钟读完

LeetCode 1082 · 分组求和、聚合结果上开窗

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

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 里不能用窗口函数。
  • 销售表允许重复行,重复的销售记录也是真实销售,不要去重。
刷题进度保存在当前浏览器