You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SELECT product_id FROM Products GROUP BY product_id
SELECT DISTINCT product_id FROM Products
左连查询,将 tmp1 和 tmp2 左连,连接条件是 product_id
使用 if 或者 ifnull 判断 new_price 是否为空,如果为空,则使用 10 作为价格
SELECT
product_id, IF(new_price, new_price, 10) price
FROM (
SELECT product_id FROM Products GROUP BY product_id
) tmp1
LEFT JOIN (
SELECT product_id, new_price FROM Products WHERE ( product_id, change_date )
IN ( SELECT product_id, max(change_date) FROM Products WHEREDATE ( change_date ) <=DATE ( "2019-08-16" ) GROUP BY product_id )
) tmp2 USING ( product_id )
题目
题目链接:指定日期的产品价格
编写一个解决方案,找出在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。
以 任意顺序 返回结果表。
结果格式如下例所示。
解析
这题考察的点是如何查出
product_id
为3
的数据,因为这个产品在2019-08-16
之前没有修改过价格方法一
思路:
查询出在
2019-08-16
之前的最新修改过价格的product_id
,如果修改过价,那么
new_price
是有值的没有修改过价格,那么
new_price
是null
,给它赋值为10
步骤:
product_id
,查询出2019-08-16
日期之前的最新修改过价格的产品,注意:这里查询不出价格product_id
和change_date
查询出product_id
和new_price
,作为临时表tmp2
product_id
,作为临时表tmp1
SELECT product_id FROM Products GROUP BY product_id
SELECT DISTINCT product_id FROM Products
tmp1
和tmp2
左连,连接条件是product_id
if
或者ifnull
判断new_price
是否为空,如果为空,则使用10
作为价格方法二
方法二的思路正好和方法一是相反的
思路:
查询出每个产品在
2019-08-16
之前,最后修改价格的日期,在左连Products
表,那么product_id
为3
的产品就没有价格步骤:
product_id
分组,查询出2019-08-16
之前,最后修改价格的日期,作为临时表tmp
tmp
和Products
左连,连接条件是product_id
和change_date
if
或者ifnull
判断new_price
是否为空,如果为空,则使用10
作为价格方法三
思路:
使用窗口函数,将每个产品按照修改日期进行排序
步骤:
2019-08-16
日期前修改过价格的记录,将大于2019-08-16
的日期设置为null
,作为临时表tmp
product_id
分组,按照change_date
降序排序,作为临时表tmp2
tmp2
,筛选出rk = 1
的product_id
和new_price
if
或者ifnull
判断new_price
是否为空,如果为空,则使用10
作为价格distinct
去重,可能会有某个产品某天修改多次的记录相关联的题目
按分类统计薪水
The text was updated successfully, but these errors were encountered: