2016-09-30 36 views
1

在sql2014中,我有一個包含4個整數(W,X,Y,Z)和bigint B的表格。其中C(n,k)表示從n個對象中取出的k個對象的組合,即通常的n!/ [k!(nk)!]如何計算tsql中的大組合數量

W,X,Y和Z的最高值是40,所以最大的B是1.37847E + 11 我可以使用Excel(使用函數COMBIN)計算正確的值,但我不能在SQL中相同。我可以用我需要的W,X,Y,Z的所有組合來生成表格,但是當我嘗試計算大數值B時,我不知道如何處理像「40!」這樣的事情。

我想用一個CTE用階乘的preinserted值,是這樣的:

;WITH factorials AS(
SELECT 2 as N, 2 AS F 
UNION ALL 
SELECT 3,6 
UNION ALL... 
) 

,但我不知道如何存儲40個!等等。

使用.NET填充表格不是一個選項,它應該由SQL創建。

我甚至想過使用一個像CTE這樣的表格,並在兩列或三列中存儲階乘,第一個存儲數十億,第二個存儲數十億億等等(使用INT),但之後我不知道如何在(Ax10^9 + B)/(Cx10^9 + D)中存儲這樣的數字之間進行劃分。

如何在tsql中管理大於bigint的整數?

+0

現在我正在考慮多項式中的好老分區......它似乎幾乎微不足道......但它不是!因爲我仍然需要處理太大的數字可能 –

回答

1

我相信這不是一個完整的解決方案,但也許它會給你如何開始的一些想法。也許你可以使這個存儲過程,並通過@n和@k

使用DOUBLE似乎不會導致任何問題時,我把它回到BIGINT。也許別人可以評論這樣做的明顯危險。

DECLARE @final_value DOUBLE PRECISION 
DECLARE @n INT = 40 
DECLARE @k INT = 20 

;WITH CTE AS 
(
SELECT 1 AS num,CAST(1 AS DOUBLE PRECISION) AS factorial 
UNION ALL 
SELECT num+1,CAST(factorial*(num+1)AS DOUBLE PRECISION) FROM CTE 
WHERE CTE.num < 40 
) 

SELECT * INTO #temp_numbers FROM CTE 

SET @final_value = (SELECT factorial FROM #temp_numbers WHERE num = @n)/
    (SELECT factorial FROM #temp_numbers WHERE num = @k)/
    (SELECT factorial FROM #temp_numbers WHERE num = (@[email protected])) 

PRINT CAST(@final_value AS BIGINT) 
DROP TABLE #temp_numbers 
+0

這完全是我所需要的。今天我有機會將你的答案應用到我的案例中,並且它完美而且非常快速地工作。謝謝! –