千家信息网

SQL Server计算Jaccard系数—sim(i,j)

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前些天,在Q群里面看到有人请教这样一个问题:在SQL Server中如何用SQL实现以下计算由图得知,该问题是如何计算Jaccard系数。Jaccard系数,又称为Jaccard相似系数(Jaccar
千家信息网最后更新 2026年11月01日SQL Server计算Jaccard系数—sim(i,j)

前些天,在Q群里面看到有人请教这样一个问题:在SQL Server中如何用SQL实现以下计算

由图得知,该问题是如何计算Jaccard系数。Jaccard系数,又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。


SQL Server通过intersect实现交集,union实现并集,如下:


intersect交集

计算交集代码段如下:(1 intersect 0 = null,1 intersect 1 = 1,0 intersect 0 = 0)


union并集

计算并集代码段如下:(1 union 0 = 1 0,1 union 1 = 1,0 union 0 = 0)


原理简介:

通过sys.columns表获取表的字段名与字段ID,循环字段名,并根据字段名去取到表中对应的值:如字段名为A,那么取ID为1的值:select A from test where id=1,取ID为2的值:select A from test where id=2,

然后将2个值进行交集与并集,字段循环结束后,得到@str_intersect,@str_union,计算比值:len(@str_intersect)*1.0/len(@str_union)


最终结果如下:


全部代码如下:(建表,见注释部分)

--create table Test(id int,A INT,B INT,C INT,D INT,E INT,F INT)--INSERT INTO TEST SELECT 1,1,1,1,0,0,0--INSERT INTO TEST SELECT 2,0,1,0,1,0,1--INSERT INTO TEST SELECT 3,1,1,1,1,0,1--INSERT INTO TEST SELECT 4,1,1,1,0,1,0--INSERT INTO TEST SELECT 5,0,1,0,1,1,1--INSERT INTO TEST SELECT 6,0,0,1,0,1,1--drop table Test_result--create table Test_result(id int,_1_ numeric(10,4),_2_ numeric(10,4),_3_ numeric(10,4),_4_ numeric(10,4),_5_ numeric(10,4),_6_ numeric(10,4))--insert into Test_result select 1,null,null,null,null,null,null--insert into Test_result select 2,null,null,null,null,null,null--insert into Test_result select 3,null,null,null,null,null,null--insert into Test_result select 4,null,null,null,null,null,null--insert into Test_result select 5,null,null,null,null,null,null--insert into Test_result select 6,null,null,null,null,null,nullSELECT name,column_id  into #test  FROM SYS.COLUMNS WHERE object_id =object_id('dbo.test')and column_id>1declare @id_1 int=0,@id_2 int=0,@str_union varchar(max),@a_union int,@sql_union varchar(max),@str_intersect varchar(max),@a_intersect int,@sql_intersect varchar(max)declare @name varchar(20),@column_id intcreate table #a_union(num int)create table #a_intersect(num int)declare @min_id int=0,@max_id int=0,@global_min_id int=0,@global_max_id int=0select @min_id=min(id),@max_id=max(id),@global_min_id=min(id),@global_max_id=max(id) from Testwhile(@min_id<=@max_id)beginselect @id_1=@min_id,@id_2=@global_min_idwhile @id_2<=@global_max_idbeginselect @str_union='',@str_intersect=''while(select count(1) from #test)>0 beginselect top 1 @name=name,@column_id=column_id from #test order by column_idselect @sql_union='select CASE '+'WHEN (select count(1) from (SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_1)+'union SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_2)+') as a)>1 THEN 1'+' WHEN ISNULL((SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_1)+' UNION  SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_2)+'),0)=0 THEN 0 ELSE 1 END'insert into #a_unionexec(@sql_union)SELECT @a_union=num from #a_uniondelete from #a_unionif(@a_union=1)select @str_union+=@nameselect @sql_intersect='select CASE WHEN ISNULL((SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_1)+' INTERSECT  SELECT '+@name+' FROM TEST WHERE ID='+convert(varchar,@id_2)+'),0)=0 THEN 0 ELSE 1 END'insert into #a_intersectexec(@sql_intersect)SELECT @a_intersect=num from #a_intersectdelete from #a_intersectif(@a_intersect=1)select @str_intersect+=@namedelete from #test where @name=name and @column_id=column_idendinsert into #test SELECT name,column_id FROM SYS.COLUMNS WHERE object_id =object_id('dbo.test')and column_id>1--select @str_union,@str_intersect,@column_id,@id_1,@id_2if(@id_2=1)    update Test_result set _1_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1if(@id_2=2)    update Test_result set _2_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1if(@id_2=3)    update Test_result set _3_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1if(@id_2=4)    update Test_result set _4_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1if(@id_2=5)    update Test_result set _5_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1if(@id_2=6)    update Test_result set _6_= convert(numeric(10,4),len(@str_intersect)*1.0/len(@str_union)) where id=@id_1   set @id_2=@id_2+1endset @min_id=@min_id+1enddrop table #testdrop table #a_uniondrop table #a_intersect-------------create table test_str_column(id int,str_columns varchar(max))--insert into test_str_column select 1,null--insert into test_str_column select 2,null--insert into test_str_column select 3,null--insert into test_str_column select 4,null--insert into test_str_column select 5,null--insert into test_str_column select 6,nullselect * into #temp_test_table from testselect name,column_id into #tmp_test_columns from sys.columns where object_id=object_id('dbo.test') and column_id>1declare @id int,@col_name varchar(20),@col_id int,@string_columns varchar(max),@sql_rs varchar(max),@num_1 intcreate table #tmp_rs(num int)while (select count(1) from #temp_test_table)>0beginselect top 1 @id=id from #temp_test_table order by idset @string_columns=''while(select count(1) from #tmp_test_columns)>0beginselect top 1 @col_name=name,@col_id=column_id from #tmp_test_columns order by column_idselect @sql_rs='select '+@col_name+' from test where id='+convert(varchar,@id)insert into #tmp_rsexec(@sql_rs)select @num_1=num from #tmp_rsif(@num_1=1)set @string_columns=@string_columns+@col_namedelete from #tmp_test_columns where @col_name=name and @col_id=column_iddelete from #tmp_rsendinsert into #tmp_test_columns select name,column_id  from sys.columns where object_id=object_id('dbo.test') and column_id>1update test_str_column set str_columns=@string_columns where id =@iddelete from #temp_test_table where @id=idenddrop table  #temp_test_tabledrop table #tmp_test_columnsdrop table #tmp_rsselect * from testselect * from test_str_columnselect * from Test_result


字段 交集 系数 相似 代码 样本 问题 循环 之间 原理 差异 差异性 数值 有限 比值 注释 相似性 简介 结果 部分 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 广州淘业互联网络科技 深圳恒合互联网络科技有限公司 上海挚品互联网科技 齐家互联网科技 互联网科技公司有哪些 天速互联网络科技有限公司 互联网科技热点资讯 中国的互联网科技企业的崛起 荆州市昕露互联网络科技有限公司 杭州壁岐互联网科技有限公司 阿里互联网科技企业 深圳无忧互联网科技 江苏互联网科技小贷 宁波跨境商互联网科技有限公司 保山互联网科技靠谱吗 福仕德教育科技互联网 中国互联网公司的科技投入 深圳互联网科技园地址 山东蛋芒互联网科技有限公司 互联网科技公司起名 海南购全球互联网科技 广州慧亚互联网科技怎么样 贵州叶脉互联网科技有限公司所属行业 互联网软件和科技 山东有哪些互联网科技公司 云南省自由互联网科技有限公司 广州燕处互联网科技有限公司 艺电能源互联网科技有限公司招聘 杭州科技互联网公司有哪些
0