2012-03-30 10 views
4

Ich habe eine Tabelle "Elemente" mit einer Spalte "Nummer", geben SMALLINT, die Zahlen von 1 bis 56 enthält. Wie kann ich eindeutige Sätze von 5 Zahlen von jeder möglichen Kombination von 1 bis 56, mit einer SQL-Anweisung?In SQL, Wie kann ich jede mögliche einzigartige Kombination von 5! 56 erzeugen?

In APL (Programmiersprache) funktioniert eine einfache dyadische Funktion 5! 56!

EDIT: In guten alten MS-DOS QBASIC, ich erreicht es wie folgt aus:

10 OPEN "C:\5NUMBERS.OUT" FOR OUTPUT ACCESS READ WRITE AS #1 
12 LET SER = 0 

15 LET E = 56 
30  FOR B5 = 5 TO E 
40   FOR B4 = 4 TO E 
50    FOR B3 = 3 TO E 
60     FOR B2 = 2 TO E 
70      FOR B1 = 1 TO E 
80 

88 IF B5 = B1 THEN 190 
89 IF B5 = B2 THEN 190 
90 IF B5 = B3 THEN 190 
91 IF B5 = B4 THEN 190 

92 IF B4 = B1 THEN 180 
93 IF B4 = B2 THEN 180 
94 IF B4 = B3 THEN 180 

95 IF B3 = B1 THEN 170 
96 IF B3 = B2 THEN 170 

97 IF B2 = B1 THEN 160 

98 LET SER = SER + 1 

100 PRINT #1, SER; "|"; 
130 PRINT #1, B1; "|"; 
131 PRINT #1, B2; "|"; 
132 PRINT #1, B3; "|"; 
133 PRINT #1, B4; "|"; 
134 PRINT #1, B5; "|"; 
140 PRINT #1, B1 + B2 + B3 + B4 + B5; "|" 

150      NEXT B1 
160     NEXT B2 
170    NEXT B3 
180   NEXT B4 
190  NEXT B5 
205 CLOSE 
210 END 
220 SYSTEM 

Das, nebenbei gesagt, erstellt meine Last-Datei in eine Informix-SQL-Tabelle

TABLE combos 
(
seq_id SERIAL, 
ball_1 SMALLINT, 
ball_2 SMALLINT, 
ball_3 SMALLINT, 
ball_4 SMALLINT, 
ball_5 SMALLINT, 
sum SMALLINT 
); 

Ich habe combos.sum verwendet, um ein Glockenkurven-Diagramm zu erstellen, das die Anzahl der Kombinationen mit der gleichen Summe jedes Elements zeigt.

Antwort

5

Wenn Sie Paare von identischen Nummern einschließen möchten, z. (5,5):

SELECT e1.number AS number1 
     ,e2.number AS number2 
FROM elements e1 
     ,elements e2 
WHERE e1.number <= e2.number; 

Wenn Sie nur verschiedene Zahlen in jedem Paar haben will:

SELECT e1.number AS number1 
     ,e2.number AS number2 
FROM elements e1 
     ,elements e2 
WHERE e1.number < e2.number; 
+0

nein, jede Zahl in der Menge muss eindeutig sein, wie in einem Lottospiel –

3

Nicht, dass ich würde tatsächlich Verwendung eine Datenbank für diese Art von Aufgabe, aber wenn Sie waren gezwungen, diese unter Androhung von Folter oder Verstümmelung zu tun, ich in so etwas wie (number verkürzt num zur Formatierung Zweck) aussehen:

select a.num, b.num, c.num, d.num, e.num 
from elements a, elements b, elements c, elements d, elements e 
where a.num <> b.num and a.num <> c.num and a.num <> d.num and a.num <> e.num 
    and b.num <> c.num and b.num <> d.num and b.num <> e.num 
    and c.num <> d.num and c.num <> e.num 
    and d.num <> e.num 

Es kreuzt grundsätzlich die Tabelle mit sich selbst, um fünf Spalten zu generieren, und filtert dann diejenigen heraus, in denen eine der Zahlen identisch ist.

Beachten Sie, dass dies Permutationen gibt: (1,2,3,4,5) unterscheidet sich von (1,2,3,5,4). Wenn Sie Kombinationen wollen (wobei die Reihenfolge keine Rolle spielt), würden Sie etwas andere Klauseln verwenden:

select a.num, b.num, c.num, d.num, e.num 
from elements a, elements b, elements c, elements d, elements e 
where a.num > b.num and b.num > c.num and c.num > d.num and d.num > e.num 
+0

1,2,3,4,5 nicht wiederholen kann, unabhängig von der Reihenfolge der Zahlen .. denk an einzigartigen Kombinationen von Lottozahlen. –

+1

@Frank, dann verwenden Sie den zweiten Befehl - das wird Ihnen einzigartige Kombinationen geben (mathematisch, das ist, was Kombinationen sind - nicht eindeutige Kombinationen werden Permutationen genannt), wie gewünscht. – paxdiablo

6

Wenn von „eindeutige Sätze“ Sie meinen, was ich glaube, Sie haben (sorry, ich weiß nicht, APL !

SELECT e1.number, e2.number, e3.number, e4.number, e.number 
    FROM elements e1, elements e2, elements e3, elements e4, elements e5 
WHERE e1.number < e2.number 
    AND e2.number < e3.number 
    AND e3.number < e4.number 
    AND e4.number < e5.number 
; 

„könnte dies die Elemente in einer Tabelle zu speichern, ohne tatsächlich erreicht werden, die .. dh der Server es zu Tabelle I ohne Rückgriff tun lassen:), können Sie schreiben?/O? "

Ja, es ist ein Oracle-Trick Daten on the fly zu generieren, um die hierarchische Abfrage und die CTE-Syntax:

WITH elements AS 
(select rownum as number 
    from dual 
    connect by level <= 56) 
SELECT e1.number, e2.number, e3.number, e4.number, e.number 
    FROM elements e1, elements e2, elements e3, elements e4, elements e5 
WHERE e1.number < e2.number 
    AND e2.number < e3.number 
    AND e3.number < e4.number 
    AND e4.number < e5.number 
; 
+0

der Satz 1,2,3,4,5 kann nicht wiederholt werden, Beispiel: 5,4,3,2,1. –

+0

APL ist sehr mächtig mit Arrays! Wäre schön, wenn SQL APL-ähnliche Funktionen haben könnte! –

+1

@FrankComputer: Perfekt. Die Abfrage, die ich gab, wird niemals '5,4,3,2,1', nur' 1,2,3,4,5' zurückgeben. (Das ist es, was 'WHERE ... AND ...' tut: es erfordert, dass die erste Zahl in jeder Reihe kleiner als die zweite ist, die zweite weniger als die dritte usw. Dies garantiert, dass alle Elemente darin enthalten sind Die Zeilen sind unterschiedlich, und außerdem hat jede Zeile mindestens ein Element, das sich von jeder anderen Zeile unterscheidet.) – ruakh

2

Mein erster Gedanke wäre ein cartesianischen zu tun und nur dafür sorgen, dass Jeder Datensatz ist höher als der letzte, so dass Sie nirgendwo doppelte Werte erhalten.Nun wäre dies so etwas wie

1,2,3,4,5 
1,2,3,4,6 
1,2,3,4,7, etc... 
but will NEVER have the reverse or mixed such as 
6,4,3,2,1 
6,2,4,3,1 
4,6,1,2,3 
as those would already be a "same" set of numbers (more along the lines of lottery style where no same number appears twice) 

JEDOCH erstellen, wenn Sie auch Duplikate wollen, wie

1,1,1,1,1 
1,2,1,2,1 
1,2,3,1,1 

Wo eine Zahl könnte wiederholt erhalten Zahlen nur die Gleichheit = statt nur <-< ändern.

select 
     YT1.Number as Num1, 
     YT2.Number as Num2, 
     YT3.Number as Num3, 
     YT4.Number as Num4, 
     YT5.Number as Num5 
    from 
     YourTable YT1 
     JOIN YourTable YT2 
      ON YT1.Number < YT2.Number 
      JOIN YourTable YT3 
       ON YT2.Number < YT3.Number 
       JOIN YourTable YT4 
        ON YT3.Number < YT4.Number 
        JOIN YourTable YT5 
        ON YT4.Number < YT5.Number 
Verwandte Themen