【发布时间】:2011-12-27 02:20:54
【问题描述】:
不幸的是,我正在使用 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
...
可以与连接有关。我的意图是保持 日历 中的日期范围以匹配 t 中的日期范围。
编辑: 关于我正在寻找的内容的更多说明,只是为了具体一点:
在生成 t_fill 时,我想准确涵盖 t 中的日期范围,以及介于两者之间的任何日期。因此,正确的 t_fill 将与 t 在同一日期开始并在同一日期结束。 t_fill 有两个属性:
1) 一旦某个 id 出现在某个日期,它总是会在以后的每个日期都有一行。这是原始问题中隐含的填补空白。
2) 如果某个 id 的行在某个日期之后不再出现,t_fill 解决方案应该从最后一个数据点的日期开始生成具有相同度量值(和 0 增量)的行截至t的结束日期。
解决方案可能会回填较早的日期,直到 t 中日期范围的开始。也就是说,对于出现在 t 中的第一个日期之后的任何 id,t 中的第一个日期和该 id 的第一个日期之间的行将用 metric=0 填充并且 d_metric=0。我不喜欢这种解决方案,因为它对进入系统的每个 id 都有更高的增长因子。但我可以通过仅在新表中选择 metric!=0 和 d_metric!=0 的行来轻松处理它。
【问题讨论】:
-
我对 Vertica 一无所知,但是,正如他们在 their site 上所说的那样,“Vertica 高级分析的一些功能包括:原生空白填充……”。所以,如果我是你,我可能应该开始朝那个方向调查。
-
我们过去曾尝试过他们的 GFI 功能,但它有一个非常特殊的倾向,不适合我们这里的需求。
-
什么具体不能满足您的需求?似乎使用恒定插值来填补空白将是可行的方法。
-
@geoff 我澄清了为什么我认为专注于插值在数据点之间的间隙填充在我的 cmets 中是不够的:stackoverflow.com/a/8714804/1116963
标签: sql date fill vertica gaps-in-data