Aquí está la jist del problema: Dada una lista de conjuntos, tales como:partición de una lista de conjuntos de elementos compartidos
[ (1,2,3), (5,2,6), (7,8,9), (6,12,13), (21,8,34), (19,20) ]
devolver una lista de grupos de los conjuntos, tales que los conjuntos que han compartido elemento están en el mismo grupo.
[ [ (1,2,3), (5,2,6), (6,12,13) ], [ (7,8,9), (21,8,34) ], [ (19,20) ] ]
Nota del stickeyness - el conjunto (6,12,13) no tiene un elemento compartido con (1,2,3), pero llegar a poner en el mismo grupo a causa de (5,2 , 6).
Para complicar las cosas, debo mencionar que en realidad no tienen estos conjuntos ordenados, sino más bien una tabla de base de datos con varios millones de filas que se parece a:
element | set_id
----------------
1 | 1
2 | 1
3 | 1
5 | 2
2 | 2
6 | 2
y así sucesivamente. Así que me encantaría una forma de hacerlo en SQL, pero estaría contento con una dirección general para la solución.
EDIT: Cambié los nombres de las columnas de la tabla a (elemento, set_id) en lugar de (tecla, ID_grupo), para hacer los términos más consistentes. Tenga en cuenta que la respuesta de Kev usa los nombres de las columnas antiguas.
Felicitaciones por el esfuerzo! ¿Puedes echar un vistazo a mi respuesta y decirme si está mal, básicamente lo mismo que tu solución, o solo una solución diferente? – itsadok
Me parece que necesitaría algún paso de fusión para completar su solución: puede comenzar diferentes goup_ids para conjuntos que deberían estar en el mismo grupo, porque aún no lo ha descubierto. Si tiene un duplicado y ambos conjuntos están en grupos diferentes, combine los dos grupos. – Camille