1070. 产品销售分析 III
题目描述
销售表 Sales:
+-------------+-------+ | Column Name | Type | +-------------+-------+ | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | +-------------+-------+ (sale_id, year) 是这张表的主键(具有唯一值的列的组合)。 这张表的每一行都表示:编号 product_id 的产品在某一年的销售额。 一个产品可能在同一年内有多个销售条目。 请注意,价格是按每单位计的。
编写解决方案,选出每个售出过的产品 第一年 销售的 产品 id、年份、数量 和 价格。
- 对每个
product_id,找到其在Sales表中首次出现的最早年份。 - 返回该产品在该年度的 所有 销售条目。
返回一张有这些列的表:product_id,first_year,quantity 和 price。
结果表中的条目可以按 任意顺序 排列。
示例 1:
输入: Sales 表: +---------+------------+------+----------+-------+ | sale_id | product_id | year | quantity | price | +---------+------------+------+----------+-------+ | 1 | 100 | 2008 | 10 | 5000 | | 2 | 100 | 2009 | 12 | 5000 | | 7 | 200 | 2011 | 15 | 9000 | +---------+------------+------+----------+-------+ 输出: +------------+------------+----------+-------+ | product_id | first_year | quantity | price | +------------+------------+----------+-------+ | 100 | 2008 | 10 | 5000 | | 200 | 2011 | 15 | 9000 | +------------+------------+----------+-------+
解法
方法一
思考
每个产品只要其最早年份的全部销售行。先按产品求出最小年份,再回表取出该年的数量与价格。
子查询 GROUP BY product_id 得到 (product_id, MIN(year)),外层用元组 IN 过滤 Sales。
同一产品同一年可能有多行,因此不能只取一行聚合结果,而应保留所有匹配行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
方法二
思考
相关子查询对每个产品再聚合一次。窗口函数可以在同一趟扫描里标出组内年份名次。
RANK() OVER (PARTITION BY product_id ORDER BY year) 把最早年份标为 \(1\),外层留下 rk = 1 的行,并列最早的多行都会保留。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |