产品销售分析三:每个产品第一年的销售
LeetCode 1070 · 分组取首行、并列保留
面试怎么回答
每个产品最早一年可能有多笔销售,所以用 RANK() OVER (PARTITION BY product_id ORDER BY year) 取 rk = 1,或者 (product_id, year) IN (每个产品的最小年份)。用 ROW_NUMBER 会漏掉同一年的其他记录。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
同一张销售表,对每个产品找出它最早销售的那一年,输出这一年里该产品的所有销售记录(产品 ID、年份、数量、单价)。
表结构
- Sales:sale_id、product_id、year、quantity、price;(sale_id, year) 为主键
思路
「第一年」可能有多笔销售,都要输出。按产品分区、年份升序用 RANK 排名,取排名第一的行,并列都保留。也可以先求每个产品的最小年份,再用 (product_id, year) 回表。
参考解法
select product_id,year first_year,quantity,price
from (
select s.product_id,year,quantity,price,
rank() over(partition by product_id order by year) rk
from Sales s left join Product p
on s.product_id = p.product_id
)t1
where rk = 1
另一种写法:先求最早年份再回表
SELECT product_id, year AS first_year, quantity, price
FROM Sales
WHERE (product_id, year) IN (SELECT product_id, MIN(year) FROM Sales GROUP BY product_id)
易错点
- 用 ROW_NUMBER 只会留下第一年里的一笔销售。
- 这题同样不需要关联产品表。