计算 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
我有一个记录列表,我需要从中计算一个新字段 - 我将其称为“计算” 每行取决于前一行的编号。提供了每个 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