题目描述
(通过次数18,001 | 提交次数23,641,通过率76.14%)
Table: Prices +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | start_date | date | | end_date | date | | price | int | +---------------+---------+ (product_id,start_date,end_date) 是 Prices 表的主键。 Prices 表的每一行表示的是某个产品在一段时期内的价格。 每个产品的对应时间段是不会重叠的,这也意味着同一个产品的价格时段不会出现交叉。 Table: UnitsSold +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | purchase_date | date | | units | int | +---------------+---------+ UnitsSold 表没有主键,它可能包含重复项。 UnitsSold 表的每一行表示的是每种产品的出售日期,单位和产品 id。 编写SQL查询以查找每种产品的平均售价。 average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示: Prices table: +------------+------------+------------+--------+ | product_id | start_date | end_date | price | +------------+------------+------------+--------+ | 1 | 2019-02-17 | 2019-02-28 | 5 | | 1 | 2019-03-01 | 2019-03-22 | 20 | | 2 | 2019-02-01 | 2019-02-20 | 15 | | 2 | 2019-02-21 | 2019-03-31 | 30 | +------------+------------+------------+--------+ UnitsSold table: +------------+---------------+-------+ | product_id | purchase_date | units | +------------+---------------+-------+ | 1 | 2019-02-25 | 100 | | 1 | 2019-03-01 | 15 | | 2 | 2019-02-10 | 200 | | 2 | 2019-03-22 | 30 | +------------+---------------+-------+ Result table: +------------+---------------+ | product_id | average_price | +------------+---------------+ | 1 | 6.96 | | 2 | 16.96 | +------------+---------------+ 平均售价 = 产品总价 / 销售的产品数量。 产品 1 的平均售价 = ((100 * 5)+(15 * 20) )/ 115 = 6.96 产品 2 的平均售价 = ((200 * 15)+(30 * 30) )/ 230 = 16.96 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/average-selling-price
//测试数据 Create table If Not Exists Prices (product_id int, start_date date, end_date date, price int); Create table If Not Exists UnitsSold (product_id int, purchase_date date, units int); insert into Prices (product_id, start_date, end_date, price) values ('1', '2019-02-17', '2019-02-28', '5'); insert into Prices (product_id, start_date, end_date, price) values ('1', '2019-03-01', '2019-03-22', '20'); insert into Prices (product_id, start_date, end_date, price) values ('2', '2019-02-01', '2019-02-20', '15'); insert into Prices (product_id, start_date, end_date, price) values ('2', '2019-02-21', '2019-03-31', '30'); insert into UnitsSold (product_id, purchase_date, units) values ('1', '2019-02-25', '100'); insert into UnitsSold (product_id, purchase_date, units) values ('1', '2019-03-01', '15'); insert into UnitsSold (product_id, purchase_date, units) values ('2', '2019-02-10', '200'); insert into UnitsSold (product_id, purchase_date, units) values ('2', '2019-03-22', '30');
解题思路
Prices表保存了每个产品各个时间段的价格。
UnitsSold表保存了出售记录,包括出售日期及数量。
题目要求:返回每种产品的平均售价。
平均售价= 总销售金额 / 总销售数量。其中,总销售金额为所有出售记录的数量*价格的总和;总销售数量为所有出售数量的总和。
那么,可以先将出售记录与产品价格进行关联,获取每条出售记录的价格。
然后,按产品ID分组分组统计出总销售金额和总销售数量即可。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select a.product_id, round(sum(a.units*b.price)/sum(a.units),2) average_price from UnitsSold a inner join Prices b on a.product_id = b.product_id and b.start_date <= a.purchase_date and b.end_date >= a.purchase_date group by a.product_id;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。