计算 Vertica 中的计算字段

Calculation off of a calculated field in Vertica

我有一个记录列表,我需要从中计算一个新字段 - 我将其称为“计算” 每行取决于前一行的编号。提供了每个 ID 的“计算”字段的第一个索引。请参阅下方 excel 的屏幕截图,显示我正在尝试执行的操作,但对于数百万条记录,按 ID

分区

我的以下查询中断,因为计算尚不存在

select ID, transaction, transaction-lag(calculation) over (partition by ID) as calculation from db

这在 Vertica 中可行吗?

您的结果取决于数据的排序。但是,SQL 个表表示 个无序 个集合。如果我假设您有一列指定顺序,那么您需要这样的东西:

select t.*,
       (first_value(calculation) over (partition by id order by <ordering col>) -
        sum(transaction) over (partition by id order by <ordering col>)
       ) as calculation
from t

毕竟我需要编辑这个。 我尝试了@Gordon Linoff 的方法,但没有用,我在 post.

中提供了示例数据

我会使用 LAG() OLAP 函数。我还使用 Vertica 的 named window 子句来提高可读性 (WINDOW w AS ())。

除此之外:您的 Excel sheet 以迭代方式计算。您的 C4 是根据 B4 - C3 计算得出的,而 C3 又是按 B3 - C2 计算的,如您所示。 所以我所能做的就是嵌套两个非常相似的查询:

在您输入的第一个查询中,我将其命名为 fillonce,我设法将您的 C3 计算为 IFNULL(calculation,transaction-LAG(calculation) OVER(w))(使用命名的 window w),意思是:如果 calculation 不为空,则使用 calculation,否则从 transaction 中减去上一行 ( LAG()) 的 calculation行。

来自 fillonce 的最外层查询 select,并执行相同的操作。我加了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 子句 - 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)
)                                                      

-- return,在 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

-- 和最后的 select,我在其中填充仍然为 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)
;

-- 最后 returns:

 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