我想制作一份销售报告,显示每种产品在销售时的价格。定价存储在单独的价格历史表中,因此我想加入销售日期之前的最新价格。
我知道如何实现查询,但我正在使用的数据库(Vertica)似乎不支持我想要做的事情。
这是表结构的简化版本:
Sales
-----
Date Product ID
1/1/2001 1
2/2/2002 1
3/3/2003 1
PriceHistory
-------------
Date ProductID Price
12/31/2000 1 1.00
12/31/2001 1 1.01
12/31/2002 1 1.11
这是我想从上述数据生成的报告示例:
Sales Report
------------
Date ProductID Price
1/1/2001 1 1.00
2/2/2002 1 1.01
3/3/2003 1 1.11
这是我到目前为止编写的 SQL:
SELECT s.date,
s.productid,
ph.price
FROM Sales s,
PriceHistory ph
WHERE s.productid=ph.productid
AND ph.date=
(SELECT MAX(date)
FROM PriceHistory
WHERE productid=s.productid
AND date < s.date)
这可能适用于另一个数据库平台,但 Vertica 给了我这个错误:“不支持非等式相关子查询表达式”。它不喜欢date < s.date
我的子查询的组件。
还有另一种方法可以做到这一点吗?
后来,我发现了一个在 Vertica 上有效的解决方法,在查询中使用了对 PriceHistory 表的两个不同引用:
SELECT s.date,
s.productid,
ph.price
FROM Sales s
JOIN PriceHistory ph ON ph.date < s.date
WHERE s.productid=ph.productid
AND ph.date=
(SELECT MAX(date)
FROM PriceHistory ph2
WHERE ph2.productid=s.productid
AND ph2.date = ph.date)
可能有更好的方法来做到这一点,如果是这样,我很想听听。