Query

一個包含 39 個數字的所有組合的數據庫,一次取 5 個,總組合 = 575757

  • November 1, 2018

我想創建一個包含 39 個整數(1 到 39)的所有組合的數字數據庫,一次取 5 個。我知道可能的組合總數 = 575757。這將是數據庫的大小。

然後我想查詢數據庫的各種標準,例如由所有偶數、所有奇數、1 個偶數、1 個奇數、2 個偶數、2 個奇數等組成的組合數,然後查詢這些結果以獲取其他標準,例如所有整數的限制總和和範圍分佈。

我該怎麼做?顯然,這是一個以彩票為導向的想法,我只期待嘲笑和不屑一顧。

撇開嘲笑和不屑不談,以下查詢將返回整數的所有可能排列。

SELECT n1.i, n2.i, n3.i, n4.i, n5.i
FROM numbers AS n1
INNER JOIN numbers AS n2 ON n1.i<n2.i
INNER JOIN numbers AS n3 ON n2.i<n3.i
INNER JOIN numbers AS n4 ON n3.i<n4.i
INNER JOIN numbers AS n5 ON n4.i<n5.i

.. 假設表或公用表表達式numbers包含 39 條唯一記錄1<=i<=39

您可以根據自己的目的添加不同的過濾器,例如有多少個奇數:

WHERE (CASE WHEN n1.i%2=1 THEN 1 ELSE 0 END)+
     (CASE WHEN n2.i%2=1 THEN 1 ELSE 0 END)+
     (CASE WHEN n3.i%2=1 THEN 1 ELSE 0 END)+
     (CASE WHEN n4.i%2=1 THEN 1 ELSE 0 END)+
     (CASE WHEN n5.i%2=1 THEN 1 ELSE 0 END)>howmanyoddnums

.. 或偶數 ( WHEN nx.i%2=0 THEN ...)。並且因為數字是<在連接中“排序”的,所以n1.i始終是最低和n5.i最高的。

任何更高級的功能(或針對此事的調整)都將歸結為您使用的 SQL 平台和方言。

使用提供的查詢@Daniel來獲得沒有重複的組合。在 Postgres 中,您可以使用動態generate_series()生成基表(通常比使用數字表更快)。在其他數據庫中,您將創建一個包含列的表,用序號填充它,然後以它為基礎進行查詢。

WITH t(a) AS (SELECT * FROM generate_series (1,6))
SELECT t1.a AS a1
    , t2.a AS a2
    , t3.a AS a3
    , t4.a AS a4
    , t5.a AS a5
FROM   t AS t1
JOIN   t AS t2 ON t2.a < t1.a
JOIN   t AS t3 ON t3.a < t2.a
JOIN   t AS t4 ON t4.a < t3.a
JOIN   t AS t5 ON t5.a < t4.a

SQL小提琴。

像您描述的基本問題可能最好用組合數學來解決。您需要二項式係數(“從 n 中選擇 k”)

全為奇數的行數(有 19 行):

select (19!) / ((14!) * (5!)) = 11628

全偶數的行數:

select (20!) / ((15!) * (5!)) = 15504

1 個事件,4 個奇數:

select 19 * ((20!) / ((16!) * (4!))) = 92055

等等

。但我想一張表對於處理條件和驗證結果很有用。

引用自:https://dba.stackexchange.com/questions/76144