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

1tuwyuhd  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(360)

我正在研究不同的区块链交易,并希望根据这些交易创建给定资产的运行余额 INPUT_ADDRESS (发送货币的地址) INPUT_AMOUNT (由输入地址发送的金额), OUTPUT_ADDRESS (接收货币的地址)和 OUTPUT_AMOUNT (输出地址接收的量)
下面是我正在使用的一个表的示例:

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

如果我要计算地址的连续和 `` ,什么是有效的方法?我试着用这样的方法:

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

在这个特定的例子中,的总余额是输出金额之和,其中是输出地址(即0.18+0.24+1.13)+输入金额之和,其中是输入地址(即-0.01+-0.50+-5.03+-0.06)。所以,1.55+(-5.60)=-4.05
但我不认为这是正确的方法,我不知道如何计算输出金额(例如,当接收到的是输出地址并接收到输出金额时)

zbq4xfa0

zbq4xfa01#

这就是你想要的吗?

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

相关问题