1

我想制作一份销售报告,显示每种产品在销售时的价格。定价存储在单独的价格历史表中,因此我想加入销售日期之前的最新价格。

我知道如何实现查询,但我正在使用的数据库(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)

可能有更好的方法来做到这一点,如果是这样,我很想听听。

4

2 回答 2

2

试试这个JOIN INTERPOLATE子句。对于您的示例,以下示例完全符合您的要求:

SELECT s.date,
   s.productid,
   ph.price
FROM Sales s
left outer join PriceHistory ph  ON  s.date INTERPOLATE
    PREVIOUS VALUE ph.date
where s.productid=ph.productid
于 2014-03-15T14:45:17.637 回答
1

问题在于:

  SELECT MAX(date)
  FROM PriceHistory
  WHERE productid=s.productid
   AND date < s.date

S 未定义...子查询是独立的,不能在“外部”查询中引用 from 语句中的表。只需在您的子查询中加入即可。

SELECT MAX(date)
 FROM PriceHistory ph, Sales s
 WHERE ph.productid=s.productid
   AND date < s.date

当我在 MySQL 中时,知道其他人可以在 Vertica 上玩,我感到很嫉妒。啊..

应该提到您使用的是旧语法,其中大部分可以作为连接完成。将 max_date 称为子查询并将其移至 from 语句...内部联接功能作为该级别的过滤器。

编辑:

如果失败了,那就是 vertica 有一些子查询问题……已经有一段时间了,但我想我过去已经解决了这个问题(在 vertica 支持下):

SELECT s.date,
   s.productid,
   ph.price
FROM Sales s,
 PriceHistory ph,
(SELECT MAX(date)
  FROM PriceHistory ph, Sales s
  WHERE ph.productid=s.productid
AND date < s.date) a
WHERE s.productid=ph.productid
AND ph.date= max_date

试试那个版本......如果失败了,我会回到 vertica 支持并询问他们如何处理它(从功能上讲,你所要求的应该是标准的,我认为 vertica 只是有一个稍微改变的方式到达那里......我记得被要求避免在 where 子句中使用子查询)。

于 2013-10-15T18:53:09.487 回答