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中的运行金额(