+--------------+---------+
|Column Name |Type|+--------------+---------+
| product_id | int || product_name | varchar || unit_price | int |+--------------+---------+
product_id is the primarykey (columnwithuniquevalues) of this table.
Eachrowof this table indicates the name and the price ofeach product.
Table: Sales
1
2
3
4
5
6
7
8
9
10
11
12
13
+-------------+---------+
|Column Name |Type|+-------------+---------+
| seller_id | int || product_id | int || buyer_id | int || sale_date | date || quantity | int || price | int |+-------------+---------+
This table can have duplicate rows.
product_id is a foreignkey (reference column) to the Product table.
Eachrowof this tablecontainssome information about one sale.
Write a solution to report the products that were only sold in the first quarter of 2019. That is, between 2019-01-01 and 2019-03-31
inclusive.
Input:
Product table:+------------+--------------+------------+| product_id | product_name | unit_price |+------------+--------------+------------+|1| S8 |1000||2| G4 |800||3| iPhone |1400|+------------+--------------+------------+Sales table:+-----------+------------+----------+------------+----------+-------+| seller_id | product_id | buyer_id | sale_date | quantity | price |+-----------+------------+----------+------------+----------+-------+|1|1|1|2019-01-21|2|2000||1|2|2|2019-02-17|1|800||2|2|3|2019-06-02|1|800||3|3|4|2019-05-13|2|2800|+-----------+------------+----------+------------+----------+-------+Output:
+-------------+--------------+| product_id | product_name |+-------------+--------------+|1| S8 |+-------------+--------------+Explanation:
The product with id 1 was only sold in the spring of 2019.The product with id 2 was sold in the spring of 2019 but was also sold after the spring of 2019.The product with id 3 was sold after spring 2019.We return only product 1 as it is the product that was only sold in the spring of 2019.
We want products that were sold only in Q1 2019 (2019-01-01 to 2019-03-31) and not outside this range. We can group sales by product and check the min and max sale_date for each product.
SELECT p.product_id, p.product_name
FROM Product p
JOIN Sales s ON p.product_id = s.product_id
GROUPBY p.product_id, p.product_name
HAVINGMIN(s.sale_date) >='2019-01-01'ANDMAX(s.sale_date) <='2019-03-31';
1
2
3
4
5
SELECT p.product_id, p.product_name
FROM Product p
JOIN Sales s ON p.product_id = s.product_id
GROUPBY p.product_id, p.product_name
HAVINGMIN(s.sale_date) >='2019-01-01'ANDMAX(s.sale_date) <='2019-03-31';
1
2
3
4
5
6
7
8
9
# Product and Sales are pandas DataFramesimport pandas as pd
defsales_analysis_iii(Product, Sales):
merged = Sales.merge(Product, on='product_id')
grouped = merged.groupby(['product_id', 'product_name'])['sale_date']
mask = (grouped.min() >='2019-01-01') & (grouped.max() <='2019-03-31')
result = mask[mask].reset_index()[['product_id', 'product_name']]
return result
# result = sales_analysis_iii(Product, Sales)