订阅更新

产品销售分析三:每个产品第一年的销售

SQL 实战 123 题 · 第 51 题 中等 约 2 分钟读完

LeetCode 1070 · 分组取首行、并列保留

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

面试怎么回答

每个产品最早一年可能有多笔销售,所以用 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 只会留下第一年里的一笔销售。
  • 这题同样不需要关联产品表。
刷题进度保存在当前浏览器