表:
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
之前最新的更新价格,如果没有出现则默认价格为10。
代码如下:
select p2.product_id, ifnull(new_price,10) as price from( select *, rank() over(partition by product_id order by change_date desc) as rn from Products where change_date <= '2019-08-16') as p1 right join (select distinct product_id from products) as p2 on p2.product_id = p1.product_id where rn is null or rn = 1;
一 从表中数据可知,产品3没用存在价格更改记录在规定时间前,但是我们又需要这个产品3,所以找一个包含所有产品的表。
select distinct product_id from products
因为可能存在重复,需要去重。输出结果如下
输出
| product_id |
| ---------- |
| 1 |
| 2 |
| 3 |
二 然后再创建一个表按照要求找出时间在规定日期前的数据,并且增加一列排名对产品进行分组按照更改价格时间倒序排列。这样每个产品序列为1的就是截止到规定日期前该产品更新的最近价格。
select *, rank() over(partition by product_id order by change_date desc) as rn from Products where change_date <= '2019-08-16'
输出结果如下
输出
| product_id | new_price | change_date | rn |
| ---------- | --------- | ----------- | -- |
| 1 | 35 | 2019-08-16 | 1 |
| 1 | 30 | 2019-08-15 | 2 |
| 1 | 20 | 2019-08-14 | 3 |
| 2 | 50 | 2019-08-14 | 1 |
三 以表一只有产品表的表为主表与表二进行连接,这样没有在出现在表二中的产品后面的数据为 NULL 方便后续的处理。
select * from( select *, rank() over(partition by product_id order by change_date desc) as rn from Products where change_date <= '2019-08-16') as p1 right join (select distinct product_id from products) as p2 on p2.product_id = p1.product_id;
输出结果如下
输出
| product_id | new_price | change_date | rn | product_id |
| ---------- | --------- | ----------- | ---- | ---------- |
| 1 | 20 | 2019-08-14 | 3 | 1 |
| 1 | 30 | 2019-08-15 | 2 | 1 |
| 1 | 35 | 2019-08-16 | 1 | 1 |
| 2 | 50 | 2019-08-14 | 1 | 2 |
| null | null | null | null | 3 |
四 根据输出以及题目要求进行数据的删选从而获得最终答案。
select p2.product_id, ifnull(new_price,10) as price from( select *, rank() over(partition by product_id order by change_date desc) as rn from Products where change_date <= '2019-08-16') as p1 right join (select distinct product_id from products) as p2 on p2.product_id = p1.product_id where rn is null or rn = 1;
以上就是全部答案,如果对你有帮助请点个赞,谢谢。
来源:力扣(leecode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
转载请注明出处:
标签:1164,product,数据库,leecode,2019,08,date,id,change From: https://blog.csdn.net/CYJ1844/article/details/142934664