不幸的是,我正在使用 Vertica,这使我无法使用 CROSS APPLY。显然,Vertica 中没有 CTE 之类的东西。
这是我所拥有的:
t:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
请注意,在第一天,增量等于指标值。我想填补空白,如下所示:
t_fill:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-02 | 1 | 10 | 0 -- a delta of 0
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
我每天都在想一种方法,但我真正想要的是一个一次性的解决方案。
我想我可以使用 LAST_VALUE 得到一些东西,但我无法提出正确的 JOIN 语句,让我可以正确地对每个 id 的日常历史进行分区和排序。
编辑:假设我有一个这样的表:
calendar:
day
------------
2011-01-01
2011-01-02
...
可以参与连接。我的意图是保持calendar中的日期范围与t中的日期范围相匹配。
编辑:关于我正在寻找的内容的更多说明,具体而言:
在生成t_fill时,我想准确覆盖t中的日期范围,以及介于两者之间的任何日期。因此,正确的t_fill将在与t相同的日期开始并在相同的日期结束。 t_fill有两个属性:
1)一旦某个 id 出现在某个日期,它总是会在以后的每个日期都有一行。这是原始问题中隐含的填补空白。
2)如果在某个日期之后不再出现 id 的行,则t_fill解决方案应该愉快地生成从最后一个数据点的日期到t的结束日期具有相同度量值(和 0 增量)的行。
解决方案可能会回填较早的日期,直到t中日期范围的开始。也就是说,对于出现在 t 中的第一个日期之后的任何 id,t中的第一个日期和该 id 的第一个日期之间的行将填充 metric=0 和 d_metric=0。我不喜欢这种解决方案,因为它对进入系统的每个 id 都有更高的增长因子。但是我可以通过仅在新表中选择 metric!=0 和 d_metric!=0 的行来轻松处理它。