首页 > 解决方案 > 如何在 SQL 查询中执行此操作,根据此条件查找相似行百分比匹配?

问题描述

我有一个这样的 SQL 表:

MD5                         BlockHash
randommd51                  randstr1
randommd51                  randstr2
randommd51                  randstr3
randommd52                  randstr2
randommd52                  randstr2
randommd52                  randstr1
randommd52                  randstr7
randommd53                  randstr2
randommd53                  randstr1
randommd53                  randstr2
randommd53                  randstr3
randommd54                  randstr4
randommd54                  randstr55

我在 Python 中有另一个变量,称为“查询”(字典)。字典键是 MD5 值,值是“BlockHash”。

像这样:

{ "randommd55": ["randomstr1", "randomstr2", "randomstr1"] }

我的主要目标:

我想搜索类似的文件。MD5 值代表整个文件的 MD5 值。即使文件中有 1 位差异,它也会改变。

对于每个文件,我随机取 1KB 块并对它们进行哈希处理。

所以现在,我有一个由多个块哈希组成的查询字典。我想将查询块哈希与 SQL 表中的文件进行比较。

我想查看查询文件和 sql 文件之间有多少块哈希匹配(MD5 对于每个文件都是唯一的)。

例如:

md5=="randomd51" 所在的文件有 2 个共同的块哈希(randstr1,randstr2)。所以这是一个 2/3 = 66.666% 的匹配

md5=="randommd52" 所在的文件也有 2 个共同的块哈希(randomstr1,randomstr2)。所以这是一个 2/4,50% 的匹配。注意 randomstr2 在这个文件中重复了两次。但它只在查询哈希中重复 1 次。所以它只有 2/4 匹配(50%)。

我想快速计算 SQL 中每个唯一 MD5 的匹配百分比。我将有数百万行

标签: pythonmysqlsql

解决方案


如果我理解正确,您需要与每个 MD5 匹配的块哈希的比例:

select md5,
       avg( (blockhash in ('randomstr1', 'randomstr2', 'randomstr3') ) as matching_ratio
from t
group by md5

推荐阅读