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
    上相交)
  • 两个人相交时必须相等的最小字段数(例如,如果数字为2,则如果两个人的
    ,相同的
    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您的表有多大?