我的代码有什么问题?
问题:
表:
产品:
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]]}
一种方法是
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'
);
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