LeetCode 指定日期的产品价格

问题描述 投票:0回答:2

我的代码有什么问题?

问题:

表:

产品:

product_id | new_price | change_date

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

编写一个 SQL 查询来查找 2019 年 8 月 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
2个回答
0
投票

一种方法是

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'
                 );

0
投票

UNION
在这种情况下可以工作。

SELECT product_id, price
FROM
  (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)
   UNION SELECT DISTINCT product_id, 10 AS price
   FROM Products
   WHERE product_id NOT IN
       (SELECT product_id FROM Products
        WHERE change_date <= '2019-08-16') ) tmp
ORDER BY price DESC
© www.soinside.com 2019 - 2024. All rights reserved.