Sql server 在一个或多个字段上分组时,在列表中查找重复对象
我需要找到列表中与列表中至少一个其他对象相交的所有对象。这是由几个设置决定的:Sql server 在一个或多个字段上分组时,在列表中查找重复对象,sql-server,algorithm,linq,optimization,data-structures,Sql Server,Algorithm,Linq,Optimization,Data Structures,我需要找到列表中与列表中至少一个其他对象相交的所有对象。这是由几个设置决定的: “重复检查”字段列表(例如,一个人可以在FirstName、LastName或DOB上相交) 两个人相交时必须相等的最小字段数(例如,如果数字为2,则如果两个人的名和姓,相同的姓和DOB,或者相同的姓和DOB,或者相同的姓和DOB),则两个人相交 确定这一点最有效的方法是什么?目前,将SQL和temp表与GROUPBY语句一起使用是最有效的,但还不够好。我试着在C#/LINQ中使用字典和硬编码各种属性检查,但那更糟糕
FirstName
、LastName
或DOB
上相交)名和姓,相同的姓和DOB
,或者相同的姓和DOB
,或者相同的姓和DOB
),则两个人相交
确定这一点最有效的方法是什么?目前,将SQL和temp表与
GROUPBY
语句一起使用是最有效的,但还不够好。我试着在C#/LINQ中使用字典和硬编码各种属性检查,但那更糟糕。我一直在研究不相交集和Levenshtein距离,但对于一个大的列表来说,这似乎同样低效。这只是一个NP完全问题吗?您必须将表格更改为这种格式
如果您没有user\u id
,可以使用row\u number()
然后执行此连接
SELECT T1.user_id, T2.user_id, count(T2.FieldName)
FROM Table1 T1
LEFT JOIN Table1 T2
on T1.UserID > T2.UserID
and T1.FIELDNAME = T2.FIELDNAME
and T1.Value = T2.Value
GROUP BY T1.user_id, T2.user_id
HAVING count(T2.FieldName) >= 2
您必须使用将表格更改为此格式 如果您没有
user\u id
,可以使用row\u number()
然后执行此连接
SELECT T1.user_id, T2.user_id, count(T2.FieldName)
FROM Table1 T1
LEFT JOIN Table1 T2
on T1.UserID > T2.UserID
and T1.FIELDNAME = T2.FIELDNAME
and T1.Value = T2.Value
GROUP BY T1.user_id, T2.user_id
HAVING count(T2.FieldName) >= 2
是否有任何示例数据可供使用?您应该始终使用rdbms标记、sql server、mysql,或保存任何示例数据以供使用?您应该始终使用rdbms标记、sql server、mysql,etcI将
更改为
,以避免重复/反向配对。我明天必须仔细查看,但这看起来是朝着正确方向迈出的明确一步!只要你能处理UNPIVOT,这应该很容易。嗯,看起来你发布的第二个查询/加入没有在合理的时间内运行(7分钟以上没有完成,tempdb空间不足)。我甚至在未分割表的所有三列上都添加了索引。@b可能2您的表有多大?我将
更改为
,以避免重复/反向配对。我明天必须仔细查看,但这看起来是朝着正确方向迈出的明确一步!只要你能处理UNPIVOT,这应该很容易。嗯,看起来你发布的第二个查询/加入没有在合理的时间内运行(7分钟以上没有完成,tempdb空间不足)。我甚至在未分割的表的所有三列上都添加了索引。@B可能2您的表有多大?