目錄
題目
分析
代碼
題目
產品數據表:?Products
+---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | new_price | int | | change_date | date | +---------------+---------+ (product_id, change_date) 是此表的主鍵(具有唯一值的列組合)。 這張表的每一行分別記錄了 某產品 在某個日期 更改后 的新價格。
編寫一個解決方案,找出在?2019-08-16
?時全部產品的價格,假設所有產品在修改前的價格都是?10
?。
以?任意順序?返回結果表。
結果格式如下例所示。
示例 1:
輸入: Products 表: +------------+-----------+-------------+ | product_id | new_price | change_date | +------------+-----------+-------------+ | 1 | 20 | 2019-08-14 | | 2 | 50 | 2019-08-14 | | 1 | 30 | 2019-08-15 | | 1 | 35 | 2019-08-16 | | 2 | 65 | 2019-08-17 | | 3 | 20 | 2019-08-18 | +------------+-----------+-------------+ 輸出: +------------+-------+ | product_id | price | +------------+-------+ | 2 | 50 | | 1 | 35 | | 3 | 10 | +------------+-------+
分析
編寫一個解決方案,找出在?2019-08-16?時全部產品的價格。
關鍵點在找到?2019-08-16?前所有有改動的產品及其最新價格和沒有修改過價格的產品
沒有提供產品id列表,首先自行整理一份產品id列表,保證每個產品都考慮考慮到
(select distinct product_id from Products) a
需要找到2019-08-16?前所有有改動的產品
即針對一種產品,找到其在2019-08-16?前的最新價格,也就是最新日期的價格
select product_id,max(change_date) from Products
where change_date <= '2019-08-16'
group by product_id
將上述整理為新表b,左連接產品表a
left join (
select product_id,new_price from Products
where (product_id,change_date) in (
select product_id,max(change_date) from Products
where change_date <= '2019-08-16'
group by product_id
)
) b
on a.product_id = b.product_id
還存在沒有修改過價格的產品,所有產品在修改前的價格都是?10?。
通過ifnull,若為null,則價格為10,ifnull(b.new_price,10)
代碼
select a.product_id, ifnull(b.new_price,10) price
from (select distinct product_id from Products) a
left join (select product_id,new_price from Productswhere (product_id,change_date) in (select product_id,max(change_date) from Productswhere change_date <= '2019-08-16'group by product_id)
) b
on a.product_id = b.product_id