sql - 如何基于特定的、相同的列值进行聚类
问题描述
我正在查看不同的区块链交易,并希望根据一些规则进行集群INPUT_ADDRESS
和OUTPUT_ADDRESS
值,以帮助确定地址是否被同一所有者使用。简而言之,这是我要为集群创建的规则:
首先,我想检查是否有 >=2 的相同TRANS_HASH
值。如果存在重复值:
(A) 如果OUTPUT_ADDRESS
相同和/或OUTPUT_AMOUNT
相同,则聚类INPUT_ADDRESS
;(B) 如果INPUT_ADDRESS
相同和/或INPUT_AMOUNT
相同,则聚类OUTPUT_ADDRESS
这是我正在使用的表格示例:
BLOCK_DATE | BLOCK_HEIGHT | TRANS_HASH | INPUT_ADDRESS | OUTPUT_ADDRESS | INPUT_AMOUNT | OUTPUT_AMOUNT
01/11/2020 190 15c7853 xyz abc -0.01 0.70
01/11/2020 190 15c7853 def abc -0.50 0.70
01/11/2020 191 19vc842 abc xyz3 -5.03 0.413
01/11/2020 191 19vc842 abcd xyz3 -0.06 0.201
01/12/2020 191 188fdx8 abc xyz4 -0.10 0.09
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
从这个例子中,我们看到TRANS_HASH
15c7853出现 >=2 次,所以现在我们检查OUTPUT_ADDRESS
和/或 OUTPUT_AMOUNT 值是否相同。由于它们都是,我们将INPUT_ADDRESS
xyz和def与abc聚类
我想返回这样的东西:
TRANS_HASH | OUTPUT_ADDRESS | OUTPUT_AMOUNT | CLUSTERED_INPUT_ADDRESS | CLUSTERED_INPUT_AMOUNT
-----------+-----------------+---------------+-------------------------+-----------------------
15c7853 abc 0.70 xyz -0.01
15c7853 abc 0.70 def -0.50
我尝试使用 HAVING 子句返回重复项,但我不确定这是否是正确的方法,也不确定如何返回集群地址/金额:
SELECT TRANS_HASH, COUNT(*)
FROM blockchain_table
GROUP BY TRANS_HASH
HAVING COUNT(*) >= 2
我需要在这里做一个子查询吗?就像是:
SELECT TRANS_HASH, OUTPUT_ADDRESS, OUTPUT_AMOUNT, INPUT_ADDRESS AS CLUSTERED_INPUT_ADDRESS, INPUT_AMOUNT AS CLUSTERED_INPUT_AMOUNT
FROM
(
SELECT TRANS_HASH, COUNT(*)
FROM blockchain_table
GROUP BY TRANS_HASH
HAVING COUNT(*) >= 2
)
此外,创建两个单独的查询来解释 (A) 和 (B) 会更有效吗?还是我应该在一个查询中全部写完?
解决方案
推荐阅读
- java - 访问 Spring Filter/HandlerInterceptor 多部分和参数(表单字段)
- python - 从文本文件中删除空行、点和逗号
- typescript - 函数类型的可区分联合?
- javascript - 嵌套在输入中时如何设置复选框的样式
- php - centos7上laravel和php上传问题
- imagesharp - 使用 ImageSharp 创建缩略图 - 性能改进?
- node.js - 插入到另一个有关系的表中
- php - 在数组键中分配变量
- python-3.x - 正则表达式替换满足正则表达式条件时更新熊猫值
- odoo - 如何在odoo中添加“自定义插件文件夹”