【问题标题】:Find duplicate objects in list when grouping on one or more fields在一个或多个字段上分组时查找列表中的重复对象
【发布时间】:2015-12-28 22:53:43
【问题描述】:

我需要在列表中找到与列表中至少一个其他对象相交的所有对象。这是由几个设置决定的:

  1. “重复检查”字段列表(例如,Person 可以与 FirstNameLastNameDOB 相交)。
  2. 两个人相交的最小字段数必须相等(例如,如果数字是 2,如果人 A 和人 B 有相同的FirstNameLastName,相同的@987654326,则他们将相交@ 和 DOB,或相同的 LastNameDOB)。

确定这一点的最有效方法是什么?目前,使用带有GROUP BY 语句的SQL 和临时表是最高效的,但还不够好。我尝试在 C#/LINQ 中使用字典和硬编码各种属性检查,但情况更糟。我一直在研究不相交的集合和 Levenshtein 距离,但这对于大型列表来说似乎同样低效。这只是一个 NP 完全问题吗?

【问题讨论】:

  • 有样本数据可以玩吗?
  • 您应该始终使用 rdbms 标签、sql server、mysql 等

标签: sql-server algorithm linq optimization data-structures


【解决方案1】:

您必须将使用 UNPIVOT 的表格更改为这种格式

如果您没有user_id,您可以使用row_number() 创建一个

 USER_ID, FIELDNAME  , VALUE
   1    , "LastName" , "Smith"
   1    , "FirstName", "Jhon"
   1    , "DOB"      , "15/09/48"

然后执行此连接

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 

【讨论】:

  • 我将<> 更改为> 以避免重复/反向配对。
  • 我明天必须仔细看看,但这看起来是朝着正确方向迈出的明确一步!
  • 只要你能处理 UNPIVOT 这应该很容易。
  • 嗯,您发布的第二个查询/加入似乎没有在合理的时间内运行(超过 7 分钟后没有完成,并且 tempdb 空间不足)。我什至在 UNPIVOT 表的所有三列上都添加了索引。
  • @bmay2 你的桌子有多大?
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多