在 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
所以也许我只是想得太多了,但是有什么方法可以仅使用 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 |