Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Vertica中计算字段的计算_Sql_Vertica - Fatal编程技术网

Sql Vertica中计算字段的计算

Sql Vertica中计算字段的计算,sql,vertica,Sql,Vertica,我有一个记录列表,我需要从中计算一个新字段-我称之为“计算” 每一行取决于前面的行数。提供每个ID的“计算”字段的第一个索引。请参阅下面的excel屏幕截图,其中显示了我正在尝试做的事情,但有数百万条记录是按ID分区的 我下面的查询中断,因为计算还不存在 select ID, transaction, transaction-lag(calculation) over (partition by ID) as calculation from db 这在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
选择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