LeetCode--1070. 产品销售分析 III

60 阅读2分钟

1 题目描述

销售表 Sales

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| sale_id     | int   |
| product_id  | int   |
| year        | int   |
| quantity    | int   |
| price       | int   |
+-------------+-------+

(sale_id, year) 是这张表的主键(具有唯一值的列的组合)。 product_id 是产品表的外键(reference 列)。 这张表的每一行都表示:编号 product_id 的产品在某一年的销售额。 请注意,价格是按每单位计的。

产品表 Product

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
+--------------+---------+

product_id 是这张表的主键(具有唯一值的列)。 这张表的每一行都标识:每个产品的 id 和 产品名称。

编写解决方案,选出每个售出过的产品 第一年 销售的 产品 id年份数量 和 价格。 结果表中的条目可以按 任意顺序 排列。

2 测试用例

输入:

Sales 表:

+---------+------------+------+----------+-------+
| sale_id | product_id | year | quantity | price |
+---------+------------+------+----------+-------+ 
| 1       | 100        | 2008 | 10       | 5000  |
| 2       | 100        | 2009 | 12       | 5000  |
| 7       | 200        | 2011 | 15       | 9000  |
+---------+------------+------+----------+-------+

Product 表:

+------------+--------------+
| product_id | product_name |
+------------+--------------+
| 100        | Nokia        |
| 200        | Apple        |
| 300        | Samsung      |
+------------+--------------+

输出:

+------------+------------+----------+-------+
| product_id | first_year | quantity | price |
+------------+------------+----------+-------+ 
| 100        | 2008       | 10       | 5000  |
| 200        | 2011       | 15       | 9000  |
+------------+------------+----------+-------+

3 解题思路

  1. product_id分组,按照销售年份进行排名
select *, rank() over (partition by product_id order by year asc) as rn from Sales

执行结果

+-------+----------+----+--------+-----+--+
|sale_id|product_id|year|quantity|price|rn|
+-------+----------+----+--------+-----+--+
|1      |100       |2008|10      |5000 |1 |
|2      |100       |2009|12      |5000 |2 |
|7      |200       |2011|15      |9000 |1 |
+-------+----------+----+--------+-----+--+
  1. 筛选出排名结果为1的数据,就是每个产品第一年的销售情况
select product_id, year as first_year, quantity, price  
from (select *, rank() over (partition by product_id order by year asc) as rn  
      from Sales) as t  
where rn = 1;

执行结果

+----------+----------+--------+-----+
|product_id|first_year|quantity|price|
+----------+----------+--------+-----+
|100       |2008      |10      |5000 |
|200       |2011      |15      |9000 |
+----------+----------+--------+-----+