我有一个包含三列X,Y,Z的SQL表。我需要将它分组,以便将具有相同X或Y或Z值的所有记录分配给同一组。我需要确保具有相同值X或Y或Z的记录永远不会分成多个组。
如果您将记录视为X,Y,Z作为边的节点和值,则此问题与查找每个图中的节点将通过X,Y或Z直接或间接连接的所有图相同。边缘,但每个图形将没有与其他图形共同的边缘(否则它将是同一图形的一部分)。
几年前,我知道这叫什么,甚至记得算法,但现在它逃脱了我。请告诉我这个问题是如何调用的,这样我就可以通过Google解决问题。如果你现在是一个很好的算法 - 请指出我。如果您有SQL实现 - 我会嫁给你:)
示例:
X Y Z BUCKET
--------- ---------------- --------- -----------
1 34 56 1
54 43 45 2
1 12 22 1
2 34 11 1
最后一行在桶1中,因为Y = 34的值与第1行(在桶1中)的值相同。
答案 0 :(得分:2)
它看起来不像图表,更像是simplicial complex。 但是如果我们将这个复数视为其骨架图(数字被视为顶点而表中的一行意味着所有三个顶点都通过边连接),那么我们可以使用任何算法来查找connected components这张图。我不确定在SQL中是否有可行的方法来执行此操作,或许以某种方式使用graph database会更为谨慎。
但是,对于这个特定问题,可能有一些简单的解决方案可以通过SQL获得,我没有找到。
答案 1 :(得分:0)
查找每组x中的节点数:
select x, count(x)
from mytable
group by x
或找到集合列表x:
select distinct x from mytable;
答案 2 :(得分:0)
为什么不首先GROUP BY
其中一个列(比如X),制作存储桶,然后对Y和Z执行此操作,如果找到新组,则每次合并上一步中的所有存储桶。
重复X,Y和Z的过程,直到桶停止变化。
你在为link-in或facebook工作吗? :)