在一个或多个字段上分组时,在列表中查找重复的对象

时间:2015-10-01 01:42:57

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

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

  1. “重复检查”字段列表(例如,人员可以在FirstNameLastNameDOB上相交。
  2. 两个人相交的最小字段数必须相等(例如,如果数字为2,如果人员A和人员B具有相同的FirstNameLastName,则他们会相交,相同的FirstNameDOB,或相同的LastNameDOB)。
  3. 确定此问题的最有效方法是什么?现在,使用带有GROUP BY语句的SQL和临时表是最高效的,但还不够好。我尝试在C#/ LINQ中使用字典和硬编码各种属性检查,但情况更糟。我一直在研究不相交的集合和Levenshtein距离,但对于大型列表而言,这似乎效率低下。这只是NP完全问题吗?

1 个答案:

答案 0 :(得分:0)

您必须使用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 

然后执行此连接

//On your api interface
@POST("path/to/your/resource")
@Streaming
void apiRequest(Callback<POJO> callback);

restAdapter.apiRequest(new Callback<POJO>() {
        @Override
        public void success(POJO pojo, Response response) {
            try {
                //you can now get your file in the InputStream
                InputStream is = response.getBody().in();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });