Sql Vertica中计算字段的计算
我有一个记录列表,我需要从中计算一个新字段-我称之为“计算” 每一行取决于前面的行数。提供每个ID的“计算”字段的第一个索引。请参阅下面的excel屏幕截图,其中显示了我正在尝试做的事情,但有数百万条记录是按ID分区的 我下面的查询中断,因为计算还不存在Sql Vertica中计算字段的计算,sql,vertica,Sql,Vertica,我有一个记录列表,我需要从中计算一个新字段-我称之为“计算” 每一行取决于前面的行数。提供每个ID的“计算”字段的第一个索引。请参阅下面的excel屏幕截图,其中显示了我正在尝试做的事情,但有数百万条记录是按ID分区的 我下面的查询中断,因为计算还不存在 select ID, transaction, transaction-lag(calculation) over (partition by ID) as calculation from db 这在Vertica中可能吗?您的结果取决于
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
选择t.*,
(第一个_值(计算)超过(按id划分顺序)-
总和(事务)超过(按id划分按顺序)
)作为计算
从t
毕竟,我需要编辑这个。
我尝试了@Gordon Linoff的方法,但没有成功,我在本文中提供了示例数据
我将使用LAG()
OLAP函数。我还使用Vertica的命名窗口子句来提高可读性(windowwas()
)
除此之外:您的Excel工作表以迭代方式进行计算。您的C4
是从B4-C3
中计算出来的,而C3
则依次计算出来,如您所示,如B3-C2
所示。
所以我所能做的就是嵌套两个非常相似的查询:
在您输入的第一个查询中,我将其命名为fillonce
,我设法计算您的C3
,作为IFNULL(计算,事务延迟(计算)超过(w))
(使用命名窗口w
),意思是:如果计算不为null,则使用计算,否则,从此行的事务
中减去上一行(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子句-window w为(..)
--在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
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
结果取决于行的顺序。哪一列指定了排序?谢谢-是的,我有一个row_num列,对不起,我应该指定。您的解决方案会有所帮助,但计算并非全部根据第一个值完成,而是根据前一个值完成。所以在我的excel屏幕截图中,单元格C4是B4-C3。还有办法计算吗?@tnerbusas。它们是看待同一计算的两种方式。累积的总和就是你想要的。
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