毕竟,我需要编辑这个。
我尝试了@Gordon Linoff 的方法,但无济于事,我在这篇文章中提供了示例数据。
我会使用LAG() OLAP 函数。我还使用 Vertica 的 named window 子句来提高可读性 (WINDOW w AS ())。
除此之外:您的 Excel 工作表以迭代方式计算。您的 C4 是从 B4 - C3 计算出来的,而 C3 反过来计算,如您所示,为 B3 - C2。
所以我所能做的就是嵌套两个非常相似的查询:
在您输入的第一个查询中,我将其命名为fillonce,我设法将您的C3 计算为IFNULL(calculation,transaction-LAG(calculation) OVER(w))(使用命名窗口w),意思是:如果calculation 不为空, 使用calculation,否则从本行的transaction 中减去前一行的calculation (LAG())。
最外面的查询从fillonce 中选择,并且执行相同的操作。我添加了calc_org作为原始计算编号,供参考。
您的意见:
WITH
-- your input enhanced by row_num and expected result ...
input(id,row_num,transaction,calculation,expected) AS (
SELECT 123,1, 3.75,1.45,1.45
UNION ALL SELECT 123,2, 4.55,NULL,3.10
UNION ALL SELECT 123,3, 4.13,NULL,1.03
UNION ALL SELECT 456,1,12.3 ,3.22,3.22
UNION ALL SELECT 456,2, 2.22,NULL,-1
)
-- 输入结束...
-- 接下来是填充缺失值的第一次迭代
--注意命名窗口子句-WINDOW w AS (....)
,
fillonce AS (
SELECT
id
, row_num
, transaction
, calculation AS calc_org
,
FIRST_VALUE(calculation) OVER(w)
- SUM(transaction) OVER(w)
AS calculation
, expected
FROM input
WINDOW w AS (PARTITION BY id ORDER BY row_num)
)
-- 会返回,在fillonce:
id | row_num | transaction | calc_org | calculation | expected
----+---------+-------------+----------+-------------+----------
123 | 1 | 3.75 | 1.45 | 1.45 | 1.45
123 | 2 | 4.55 | NULL | 3.10 | 3.10
123 | 3 | 4.13 | NULL | NULL | 1.03
456 | 1 | 12.30 | 3.22 | 3.22 | 3.22
456 | 2 | 2.22 | NULL | -1.00 | -1.00
-- 以及最后的选择,我填充最后一个仍然为 NULL 的值:
SELECT
id
, row_num
, transaction
, calculation AS calc_org
, IFNULL(calculation,transaction - LAG(calculation) OVER(w)) AS calculation
, expected
FROM fillonce
WINDOW w AS (PARTITION BY id ORDER BY row_num)
;
——最终返回:
id | row_num | transaction | calc_org | calculation | expected
-----+---------+-------------+----------+-------------+---------
123 | 1 | 3.75 | 1.45 | 1.45 | 1.45
123 | 2 | 4.55 | 3.10 | 3.10 | 3.10
123 | 3 | 4.13 | NULL | 1.03 | 1.03
456 | 1 | 12.30 | 3.22 | 3.22 | 3.22
456 | 2 | 2.22 | -1.00 | -1.00 | -1.00