【问题标题】:Product Price at a Given Date from LeetCode来自 LeetCode 的给定日期的产品价格
【发布时间】:2021-11-02 21:20:08
【问题描述】:

我的代码有什么问题?

问题:

表:产品:product_id |新价格 |更改日期

(product_id, change_date) 是这个表的主键。 此表的每一行都表示某些产品的价格在某个日期更改为新价格。

编写 SQL 查询以查找 2019-08-16 的所有产品的价格。假设所有产品在任何变化之前的价格都是 10。

我的解决方案:

WITH cte1 AS (
SELECT  product_id,
        new_price AS price,
        MAX(change_date) AS new_change_date
FROM Products
WHERE change_date <= CAST('2019-08-16' AS DATE)
GROUP BY product_id
),

cte2 AS (
SELECT  product_id,
        (new_price - 10) AS price,
        MIN(change_date) AS new_change_date
FROM Products
WHERE change_date > CAST('2019-08-16' AS DATE)
GROUP BY product_id
)

SELECT  DISTINCT product_id, 
        price
        FROM cte1
UNION ALL
SELECT  DISTINCT product_id, 
        price
        FROM cte2
        WHERE NOT EXISTS (SELECT product_id from cte1 
                 WHERE cte2.product_id = cte1.product_id)

我的输出:

{"headers": ["product_id", "price"], "values": [[**1, 20**], [2, 50], [3, 10]]}

预期:

{"headers": ["product_id", "price"], "values": [[**1, 35**], [2, 50], [3, 10]]}

【问题讨论】:

    标签: sql union common-table-expression


    【解决方案1】:

    一种方法是union all。第一部分获取截至指定日期的最新价格。第二个得到其他一切:

    select p.product_id, p.price
    from products p
    where change_date = (select max(p2.change_date)
                         from products p2
                         where p2.product_id = p.product_id and
                               p2.change_date <= '2019-08-16'
                        )
    union all
    select p.product_id, 10
    from products p
    where not exists (select 1
                      from products p2
                      where p2.product_id = p.product_id and
                            p2.change_date <= '2019-08-16'
                     );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多