【LeetCode | 数据库】指定日期的产品价格

本专栏持续输出 LeetCode 题目集,欢迎订阅。

文章目录

题目

产品数据表: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| new_price     | int     |
| change_date   | date    |
+---------------+---------+
(product_id, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。
一开始,所有产品价格都为 10。

编写一个解决方案,找出在 2019-08-16 所有产品的价格。

以 任意顺序 返回结果表。

结果格式如下例所示。

 

示例 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及之前的最新价格
WITH latest_prices AS (
    SELECT 
        product_id, 
        new_price AS 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
        )
),
-- 获取所有出现过的产品ID
all_products AS (
    SELECT DISTINCT product_id FROM Products
)

-- 结合以上结果,未找到价格的产品使用初始价格10
SELECT 
    a.product_id,
    COALESCE(l.price, 10) AS price
FROM 
    all_products a
LEFT JOIN 
    latest_prices l ON a.product_id = l.product_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值