Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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 如何根据输入和输出计算资产的运行余额_Sql_Azure_Apache Spark_Apache Spark Sql - Fatal编程技术网

Sql 如何根据输入和输出计算资产的运行余额

Sql 如何根据输入和输出计算资产的运行余额,sql,azure,apache-spark,apache-spark-sql,Sql,Azure,Apache Spark,Apache Spark Sql,我正在研究不同的区块链交易,并希望基于输入地址(发送货币的地址)输入金额(由输入地址发送的金额)、输出地址(接收货币的地址)和输出金额(输出地址接收的金额) 下面是我正在使用的一个表格示例: BLOCK_DATE | BLOCK_HEIGHT | TRANS_HASH | INPUT_ADDRESS | OUTPUT_ADDRESS | INPUT_AMOUNT | OUTPUT_AMOUNT 01/11/2020 190 15c7853 abc

我正在研究不同的区块链交易,并希望基于
输入地址
(发送货币的地址)
输入金额
(由输入地址发送的金额)、
输出地址
(接收货币的地址)和
输出金额
(输出地址接收的金额)

下面是我正在使用的一个表格示例:

BLOCK_DATE | BLOCK_HEIGHT | TRANS_HASH | INPUT_ADDRESS | OUTPUT_ADDRESS | INPUT_AMOUNT | OUTPUT_AMOUNT
01/11/2020    190            15c7853       abc             xyz1             -0.01          0.0001
01/11/2020    190            14v9876       abc             xyz2             -0.50          0.70
01/11/2020    191            19vc842       abc             xyz3             -5.03          0.413
01/12/2020    192            20ff4d3       abc             xyz4             -0.06          0.201
01/12/2020    192            154gf34       xyz1            abc              -0.07          0.18
01/12/2020    192            45f4ti5       ggg             abc              -0.10          0.24
01/12/2020    192            33cv5c5       jjj             abc              -0.08          1.13 
如果我要计算地址
abc
的运行总和,那么什么是有效的方法呢?我尝试使用以下方法:

SELECT BLOCK_DATE, BLOCK_HEIGHT, TRANS_HASH, INPUT_ADDRESS, OUTPUT_ADDRESS, INPUT_AMOUNT, OUTPUT_AMOUNT, SUM (INPUT_AMOUNT) OVER (ORDER BY DATE) AS RunningAgeTotal
FROM TRANSACTION_TABLE
WHERE INPUT_ADDRESS = abc
在此特定示例中,abc的总余额将是输出金额之和,其中abc是输出地址(即0.18+0.24+1.13)+输入金额之和,其中abc是输入地址(即-0.01+-0.50+-5.03+-0.06)。因此,1.55+(-5.60)=-4.05

但我不认为这是正确的方法,我不确定如何计算输出金额(例如,当abc接收到的是输出地址并接收到输出金额时)

这是您想要的吗

select t.*,
       sum(case when input_address = 'ABC' then input_amount
                when output_address = 'ABC' then output_amount
           end) over (order by block_date) as running_amount
from transaction_table t
where 'ABC' in (input_address, output_address);
这是与输入/输出列对齐的金额的累积总和

编辑:

您可能需要:

       sum(case when input_address = 'ABC' then input_amount
                when output_address = 'ABC' then output_amount
           end) over (order by block_date, block_height) as running_amount

编辑你的问题并显示你想要的结果。你能解释一下为什么行有不同的金额吗?我只希望有一个金额。当然,已编辑。行有不同的金额,因为可能有与交易相关的费用,或者可以将其分为不同的交易。我现在不需要关注这些方面,因为虽然行级别的运行总计需要一个或多个列来定义排序,并且每行都是唯一的。这给了我总余额,但我正在寻找滚动余额(即每行将返回最近的
运行总计,而不是最终总计)@David…这是两天之间的连续余额。要在一天内获得连续余额,您需要一个列来指定一天内的顺序。您的问题不清楚该顺序。
block\u height
可以指定顺序(即数字越低,交易越老).我需要在订单中以某种方式使用它吗?对不起,没有clear@David…您可以按
将其添加到
订单中,但您的示例数据中有重复项。我尝试了这一方法,就每个区块高度的运行总数而言,它似乎工作正常,但它不限于
输入地址='ABC“
而是返回每一行:
选择t.*,求和(输入地址为'ABC'时的大小写,然后输出地址为'ABC'时的输入金额,然后输出金额结束)作为事务表t中的运行金额(