Query
一個包含 39 個數字的所有組合的數據庫,一次取 5 個,總組合 = 575757
我想創建一個包含 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
像您描述的基本問題可能最好用組合數學來解決。您需要二項式係數(“從 n 中選擇 k”)。
全為奇數的行數(有 19 行):
select (19!) / ((14!) * (5!)) = 11628
全偶數的行數:
select (20!) / ((15!) * (5!)) = 15504
1 個事件,4 個奇數:
select 19 * ((20!) / ((16!) * (4!))) = 92055
等等
。但我想一張表對於處理條件和驗證結果很有用。