要求:编写一个 SQL 查询,选出每个销售产品的第一年的产品 id、年份、数量和价格。
销售表 Sales的结构:
+-------------+-------+
| Column Name | Type |
+-------------+-------+
| sale_id | int |
| product_id | int |
| year | int |
| quantity | int |
| price | int |
+-------------+-------+
sale_id 是此表的主键。
product_id 是产品表的外键。
请注意,价格是按每单位计的。
产品表 Product的结构:
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| product_id | int |
| product_name | varchar |
+--------------+---------+
product_id 是此表的主键。
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 |
+------------+--------------+
Result Table:
+------------+------------+----------+-------+
| product_id | first_year | quantity | price |
+------------+------------+----------+-------+
| 100 | 2008 | 10 | 5000 |
| 200 | 2011 | 15 | 9000 |
+------------+------------+----------+-------+
分析:
1.要求求出每个产品第一年的产品 id、年份、数量和价格,因此需要以产品id进行分组,通过使用窗口函数对年份进行升序排序
2.取得序号为1就是最终结果,同时需要考虑一年内数量和价格会发生变化,因此使用rank() over()函数作为开窗函数
SQL语句:
select product_id,year as first_year,quantity,price
from
(select sale_id,product_id,year,quantity,price,
rank() over(partition by product_id order by year asc) as r
from sales)a
where r=1;