如何计算tsql中的大组合数

如何计算tsql中的大组合数,tsql,combinations,factorial,bigint,Tsql,Combinations,Factorial,Bigint,在sql2014中,我有一个包含4个整数W、X、Y、Z和一个bigint B的表。 B=CX,Z*CW-X;Y-Z,其中Cn,k代表从n个对象中提取的k个对象的组合,即通常的n/[k!n-k!] W、X、Y和Z的最大值为40,因此最大B为1.37847E+11 我可以使用函数combi使用Excel计算正确的值,但在SQL中我无法计算相同的值。我可以用我需要的W,X,Y,Z的所有组合生成这个表,但是当我试图计算B的大值时,我不知道如何处理像40 我想使用预插入阶乘值的CTE,类似于: ;WITH

在sql2014中,我有一个包含4个整数W、X、Y、Z和一个bigint B的表。 B=CX,Z*CW-X;Y-Z,其中Cn,k代表从n个对象中提取的k个对象的组合,即通常的n/[k!n-k!]

W、X、Y和Z的最大值为40,因此最大B为1.37847E+11 我可以使用函数combi使用Excel计算正确的值,但在SQL中我无法计算相同的值。我可以用我需要的W,X,Y,Z的所有组合生成这个表,但是当我试图计算B的大值时,我不知道如何处理像40

我想使用预插入阶乘值的CTE,类似于:

;WITH factorials AS(
SELECT 2 as N, 2 AS F
UNION ALL
SELECT 3,6
UNION ALL...
)
但我不知道如何储存40!诸如此类

使用.NET填充表不是一个选项,它应该由SQL完成

我甚至想过使用像之前的CTE这样的表,并将阶乘存储在两列或三列中,第一列存储数十亿,第二列存储数十亿,等等,使用整数,但我不知道如何在这样存储的数字之间进行除法,如在Ax10^9+B/Cx10^9+D中


如何在tsql中管理大于bigint的整数?

请检查此处的十进制和数字数据类型:

我确信这不是一个完整的解决方案,但可能会让您了解如何开始。也许您可以将其作为存储过程并传入@n和@k

当我将DOUBLE转换回BIGINT时,使用DOUBLE似乎不会引起任何问题。也许其他人可以评论这样做的明显危险

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 = (@n-@k))  

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

现在我在考虑多项式之间的良好的古老除法。。。这看起来几乎微不足道。。。但事实并非如此!因为我仍然需要处理太多的数字,这可能正是我所需要的。今天我有机会将你的答案应用到我的案例中,它运行得非常完美和快速。谢谢!