在 Vertica 中创建 Nested/Loop 计算 (?)

Creating a Nested/Loop Calculation in Vertica (?)

所以也许我只是想得太多了,但是有什么方法可以仅使用 SQL 语法在 Vertica 中复制 nested/loop 计算。

解释-

在 AP 列中,我有一个属性键每月剩余的值,在 CHANGE_1M 列中,我有一个要应用的属性值。

目标是为了future values计算前面的Row partition AP*CHANGE_1M,由后面的row partitionCHANGE_1M填入未来的AP值。

作为参考,我在完整数据集中每个周期有 15,000 个键,每年有 60 个周期。

示例计算

第 5 期 = (Period4_AP * Period5_CHANGE_1M)+Period4_AP

第 6 期 = (((Period4_AP * Period5_CHANGE_1M)+Period4_AP)*Period6_CHANGE_1M) + ((Period4_AP * Period5_CHANGE_1M)+Period4_AP)

等等

顶部的示例数据

预期结果如下

Vertica 还没有(还?)RECURSIVE WITH 子句,这里似乎需要它来进行递归计算。

唯一可能的解决方法是乏味的:编写(或生成,例如,使用 perl 或 Python)您需要迭代多少嵌套查询。

如果您想沿着这条路走下去,我只想详细说明这一点。

好久不见 - 我应该早点回来回答这个问题。

我一直在思考解决这个问题的编程方法,我天生就忘记了它是一个数学方程式,有数学函数就有解决方案。

基本上这个问题围绕着table乘法。

解决方法是简单地使用LOG/LN函数乘以并使用EXP转换回来。

简单求解的片段。

希望这对其他迷失的灵魂有所帮助,不要忘记你的数学背景而陷入自我挫败的漩涡。


EXP(SUM(LN(DEGREDATION)) OVER (ORDER BY PERIOD_NUMBER ASC ROWS UNBOUNDED PRECEDING)) AS DEGREDATION_RATE

** 受控于 factors/attributes 您需要使用 PARTITION

分层的数据

基本上,我不是从保留 PX/P0 开始,而是退化 P1/P0 - P2/P1 等等。


PERIOD_NUMBER DEGRADATION DEGREDATION_RATE DEGREDATION_RATE x 100000
0 100.00% 100.00% 100000.00
1 57.72% 57.72% 57715.18
2 60.71% 35.04% 35036.59
3 70.84% 24.82% 24820.66
4 76.59% 19.01% 19009.17
5 79.29% 15.07% 15071.79
6 83.27% 12.55% 12550.59
7 82.08% 10.30% 10301.94
8 86.49% 8.91% 8910.59
9 89.60% 7.98% 7984.24
10 86.03% 6.87% 6868.79
11 86.00% 5.91% 5907.16
12 90.52% 5.35% 5347.00
13 91.89% 4.91% 4913.46
14 89.86% 4.41% 4414.99
15 91.96% 4.06% 4060.22
16 89.36% 3.63% 3628.28
17 90.63% 3.29% 3288.13
18 92.45% 3.04% 3039.97
19 94.95% 2.89% 2886.43
20 92.31% 2.66% 2664.40
21 92.11% 2.45% 2454.05
22 93.94% 2.31% 2305.32
23 89.66% 2.07% 2066.84
24 94.12% 1.95% 1945.26
25 95.83% 1.86% 1864.21
26 92.31% 1.72% 1720.81
27 96.97% 1.67% 1668.66
28 90.32% 1.51% 1507.18
29 90.00% 1.36% 1356.46
30 94.44% 1.28% 1281.10
31 94.12% 1.21% 1205.74
32 100.00% 1.21% 1205.74
33 90.91% 1.10% 1096.13
34 90.00% 0.99% 986.52
35 94.44% 0.93% 931.71
36 100.00% 0.93% 931.71