4

SQL ステートメントを使用して、1 から 56 までのすべての可能な組み合わせの 5 つの数字の一意のセットを生成するにはどうすればよいですか?

APL (プログラミング言語) では、単純な 2 項関数 5!56 でうまくいきます。

編集:古き良きMS-DOS QBASICでは、次のように達成しました:

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 

ところで、これにより、ロード ファイルが INFORMIX-SQL テーブルに作成されました。

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

私は、combos.sum を使用してベル カーブ グラフを生成し、各要素の合計が同じになる組み合わせの数を示しました。

4

4 に答える 4

6

「ユニークなセット」とは、あなたがしていると私が思っていることを意味する場合 (申し訳ありませんが、私は 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
;

「実際に要素をテーブルに格納することなく、これを達成できますか?..つまり、テーブル I/O に頼らずにサーバーに実行させますか?」

はい、階層クエリと CTE 構文を使用して、オンザフライでデータを生成する Oracle のトリックがあります。

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
;
于 2012-03-30T01:58:41.783 に答える
5

(5,5) のように、同じ数のペアを含めたい場合は、次のようにします。

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

各ペアに異なる番号のみを持たせたい場合:

SELECT e1.number AS number1
      ,e2.number AS number2
FROM   elements e1
      ,elements e2
WHERE  e1.number < e2.number;
于 2012-03-30T01:56:35.033 に答える
3

この種のタスクに実際にデータベースを使用するというわけではありませんが、拷問や四肢切断の脅威の下でこれを行うことを余儀なくされた場合は、次のようなものを調べます (書式設定のためnumberに短縮されています):num

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

基本的に、テーブルをそれ自体にクロス結合して 5 つの列を生成し、数字のいずれかが同一のものを除外します。

これにより順列が得られることに注意してください:(1,2,3,4,5)は とは異なり(1,2,3,5,4)ます。組み合わせが必要な場合 (順序は関係ありません)、わずかに異なる句を使用します。

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
于 2012-03-30T01:57:09.240 に答える
2

私の最初の考えは、デカルトを実行し、すべてのレコードが最後のレコードよりも高いことを確認して、数値がどこにも重複しないようにすることです。今、これは次のようなものを作成します

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)

ただし、次のような複製も必要な場合

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

数値が繰り返される数値を取得できる場合は、等値を < ではなく <= に変更します。

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
于 2012-03-30T02:01:38.483 に答える