我试图比较6个数字的两个条目,每个数字可以是0或1(即100001或011101)。如果6个中的3个匹配,我希望输出为.5。如果6个中的2个匹配,我希望输出为.33等。
以下是创建表的SQL命令
CREATE TABLE sim
(sim_key int,
string int);
INSERT INTO sim (sim_key, string)
VALUES (1, 111000);
INSERT INTO sim (sim_key, string)
VALUES (2, 111111);
我想要的输出来比较两个字符串,它们共享50%的字符,输出50%。
是否可以在SQL中进行这种比较?提前致谢
答案 0 :(得分:2)
这将返回两个字符串中等于1位的百分比:
select bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
当您将位域存储为转换为数字的基数2表示时,我们首先需要进行转换:conv(a.string, 2, 10)
,conv(b.string, 2, 10)
。
然后我们只保留每个字段中1的位:conv(a.string, 2, 10) & conv(b.string, 2, 10)
我们统计他们:bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))
最后我们只计算百分比:bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10)) / 6 * 100
。
查询返回50
和111000
的{{1}}。
这是另一个版本,它也会计算匹配的零:
111111
请注意,虽然此解决方案有效,但您应该真正存储此字段:
select bit_count((conv(a.string, 2, 10) & conv(b.string, 2, 10)) | ((0xFFFFFFFF>>(32-6))&~(conv(a.string, 2, 10)|conv(b.string, 2, 10))))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
或者更新现有数据:
INSERT INTO sim (sim_key, string)
VALUES (1, conv("111000", 2, 10));
INSERT INTO sim (sim_key, string)
VALUES (2, conv("111111", 2, 10));
然后此查询会给出相同的结果(如果您按上述方式更新了数据):
UPDATE sim SET string=conv(string, 10, 2);
并计算零:
select bit_count(a.string & b.string)/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
(用你的位域大小替换select bit_count((a.string & b.string) | ((0xFFFFFFFF>>(32-6))&~(a.string|b.string)))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;
)
答案 1 :(得分:0)
由于您将它们存储为数字,因此可以执行此操作
SELECT BIT_COUNT(s1.string & s2.string) / BIT_COUNT(s1.string | s1.string)
FROM sim s1, sim s2
WHERE s1.sim_key = 1 AND s2.sim_key = 2