LeetCode-1070. 产品销售分析 III(中等)

销售表 Sales:

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| sale_id     | int   |
| product_id  | int   |
| year        | int   |
| quantity    | int   |
| price       | int   |
+-------------+-------+
sale_id 是此表的主键。
产品 ID 是产品表的外键。
请注意,价格是按每单位计的。
产品表 Product:

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
+--------------+---------+
产品 ID 是此表的主键。
 

编写一个 SQL 查询,选出每个销售产品的 第一年 的 产品 id、年份、数量 和 价格。

查询结果格式如下:

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

Product table:
+------------+--------------+
| 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  |
+------------+------------+----------+-------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/product-sales-analysis-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

审题:查询每个产品销售第一年的信息。

思考:按照年份和产品id分组,找出年份最小的,有些只有一个。

解题:

解法一

找到每个商品第一次销售的年份.

应用MIN函数和group by.

-- 最小的年份
select S.product_id,min(S.year) as first_year
from Sales as S group by S.product_id;

(
    select S.product_id,min(S.year) as `first_year`
    from Sales as S
    group by S.product_id
) as A

再连接Sales表取出first_year时的信息.

-- 练习

select A.product_id,A.first_year,B.quantity,B.price
from (
   select S.product_id,min(S.year) as `first_year`
    from Sales as S
    group by S.product_id
) AS A join Sales as B on(A.product_id = B.product_id and A.first_year = B.year);


select A.product_id,A.first_year,B.quantity,B.price
from 
(
    select S.product_id,min(S.year) as `first_year`
    from Sales as S
    group by S.product_id
) as A
join Sales as B
    on(A.product_id = B.product_id and A.first_year = B.year)

解法二

思路同解法一.

但应用IN.

select product_id,S.year as `first_year`,quantity,price
from Sales as S
where (S.product_id,S.year) in (
    select product_id,min(year)
    from Sales
    group by product_id
)

select product_id,S.year as `first_year`,quantity,price
from Sales as S
where S.year in (
    select min(year)
    from Sales
    where product_id = S.product_id
)

知识点:

IN 操作符允许您在 WHERE 子句中规定多个值。

发布了118 篇原创文章 · 获赞 2 · 访问量 4896

猜你喜欢

转载自blog.csdn.net/Hello_JavaScript/article/details/104369140