2010-12-04 10 views
2

J'ai besoin d'aide pour trouver toutes les combinaisons possibles de la valeur dans la base de données, par exemple, j'ai ce tableau:SQL - Trouver toutes les combinaisons possibles

ITEM_SET   Support 
I1    0.244999999 
I2    0.274999999  
I3    0.258333333  
I4    0.103333333 

Je dois trouver toutes les combinaisons possibles comme ceci:

I1,I2 I1,I2,I3 I1,I2,I3,I4 
I1,I3 I1,I2,I4 
I1,I4 I1,I3,I4 
I2,I3 I2,I3,I4 
I2,I4 
I3,I4 

* S'il vous plaît noter que cette mise en forme uniquement destinée à aider à la lecture, comme ce que je dois seulement une liste des combinaisons possibles comme ce tableau:

ITEMSET 
I1    
I2      
I3     
I4 
I1,I2  
I1,I3  
I1,I4  
I2,I3  
I2,I4 
I3,I4 
I1,I2,I3 
I1,I2,I4 
I1,I3,I4 
I2,I3,I4 
I1,I2,I3,I4 
+0

Quelle saveur de SQL/SGBDR? Par exemple. MySql, Sql Server, Oracle etc.? –

+0

Appuyé. Alors que ma réponse couvre une approche SQL pseudo-ANSI qui fonctionne dans MySQL, avoir plus de contexte pourrait nous donner des optimisations potentielles. Cependant, je suis toujours intéressé par le problème principal que vous essayez de résoudre. – MrGomez

+0

Je travaille avec msaccess, référez-vous à mon commentaire ci-dessous pour la grande image. en bref c'est une partie de l'algorithme apriori – Rico

Répondre

3

Ce que vous suggérez est un n! combinaison de tous les éléments pour les longueurs 1-n. Ignorant la possibilité d'utiliser un générateur de code pour créer vos éléments, vous pourriez faire quelque chose comme ça pour chaque combinaison (MySQL):

un article:

SELECT item from ITEM_SET;

Deux articles:

SELECT one.item,two.item from ITEM_SET as one, ITEM_SET as two where one.item != two.item;

Trois objets:

SELECT one.item,two.item,three.item from ITEM_SET as one, ITEM_SET as two, ITEM_SET as three where one.item != two.item and one.item != three.item and two.item != three.item;

Rincer et répéter. Pour être pédant, je définis ITEM_SET comme nom de table et item comme attribut, qui est une composition de table plus significative.

Cette question et la question connexe sont des odeurs de code pour moi, cependant. Si vous parcourez toutes les permutations d'éléments par programme pour toutes les réponses possibles, il existe probablement un algorithme beaucoup plus simple pour résoudre votre problème. Compte tenu de votre other question est directement liée à celui-ci, peut-être vous pouvez offrir plus d'informations de fond?

+0

yup c'est lié: D puisqu'il y a une faible réponse sur mon autre question je divise le problème en plus petite pile :) voici la grande image [Data Mining] (http://stackoverflow.com/questions/ 4349698/sql-data-mining-exploitation-en utilisant-sql-query-floue apriori-algorithme-how-do-i) – Rico

+0

Voici quelques rep. Commentaire loin. ;-) Bonne réponse btw. –

+0

Très apprécié, Paul. Merci! – MrGomez

1

L'un des algorithmes les plus simples pour générer des combinaisons est le comptage de bits.
pseudo-code

N items, indexed 1-N 

for i=1 to 2^N-1 
    for each bit in i 
     if bit is set, output item[i] 

exemple pour N = 4:

N = 4, 2^4 = 16 
i = 1: binary = 00000001 -> output I1 
i = 2: binary = 00000010 -> output I2 
i = 3: binary = 00000011 -> output I1, I2 
i = 4: binary = 00000100 -> output I3 
i = 6: binary = 00000101 -> output I1, I3 
i = 7: binary = 00000111 -> output I1, I2, I3 
i = 8: binary = 00001000 -> output I4 
i = 9: binary = 00001001 -> output I1, I4 
i = 10: binary = 00001010 -> output I2, I4 
i = 11: binary = 00001011 -> output I1, I2, I4 
i = 12: binary = 00001100 -> output I3, I4 
i = 13: binary = 00001011 -> output I1, I2, I4 
i = 14: binary = 00001110 -> output I2, I2, I4 
i = 15: binary = 00001111 -> output I1, I2, I3, I4 
Questions connexes