在我的postgresql数据库中有一个这样的表
如果群集中的每个联系人都与群集中的另一个联系人共享contact\u id\u a或contact\u id\u b值(或两者都共享),如何恢复联系人群?
在上面截图中的示例中,第1-6行将位于同一个集群中,第8行不属于任何集群。
如何使用sql查询或sql查询结合java代码来实现这一点?
对于上下文,此表列出了联系人列表中所有可能的重复联系人。我们希望向列表所有者显示所有可能重复的联系人,以便用户可以手动管理这些重复。
这是我的起始代码:
DuplicateCandidate firstDuplicate = db.sql("select * from duplicates where list_id = "+list_id+ " and ignore_duplicate is not true").first(DuplicateCandidate);
String sql = "select * from duplicates where list_id = "+list_id+ "and ignore_duplicate is not true "
+ "and (contact_id_a = ? or contact_id_b = ? or contact_id_a = ? or contact_id_b = ?";
List<DuplicateCandidate> groupOfDuplicates = db.sql(sql, firstDuplicate.contact_id_a,firstDuplicate.contact_id_a, firstDuplicate.contact_id_b, firstDuplicate.contact_id_b).results(DuplicateCandidate.class);
这将带回第一行和包含16247096或16247097的任何其他行,但不会从第二个查询的结果中带回与联系人标识匹配的其他基本行。
干杯。
2条答案
按热度按时间t3psigkw1#
像这样的聚类是一个迭代过程,步骤数未知。我从来没有找到一个可以在递归查询中完成的解决方案。
我已经六年没有从事crm工作了,但是下面的功能与我们以前生成匹配组的方式类似。对于我们的工作负载来说,一行一行地完成这项工作并没有表现得足够好,而使用java等宿主语言来完成这项工作
HashMap()
以及HashSet()
反向索引会产生非常混乱的代码。假设此架构:
此函数创建两个临时表来保存中间集群,然后在不再可能进行集群时返回结果。
我见过的开发人员面临的最大的心理障碍之一就是忽略了
contact_id
对自己。这导致了不相交的处理和不必要的复杂的心理模型的左侧和右侧。如果您需要澄清此解决方案中的任何步骤,或者它不适合您,请发表意见。
另外,要知道levenshtein在
fuzzystrmatch
,效果很好。如果你愿意
clust_id
开始于1
,更改您的return query
在此函数中:它将产生:
dy1byipe2#
可以使用递归cte。这将遍历图形,然后为每一行分配图形中的最小标识符。请注意,您的数据没有每行的唯一标识符,因此首先生成一个:
列
min_id
包含所需的分组。下面是一个db<>小提琴来演示代码。