t-sql - 如何在sql中计算大组合量

标签 t-sql combinations factorial bigint

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

W、X、Y、Z 的最大值为 40,因此最大的 B 为 1.37847E+11 我可以使用 Excel(使用函数 COMBIN)计算正确的值,但不能在 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这样的表,并将阶乘存储在两列或三列中,第一个存储数十亿,第二个存储数十亿,依此类推(使用INT),但后来我不知道如何对这样存储的数字进行除法,如 (Ax10^9+B)/(Cx10^9+D)。

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

最佳答案

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

当我将其转换回 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

关于t-sql - 如何在sql中计算大组合量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39784535/

相关文章:

javascript - 如何修复 JavaScript 中潜在的无限循环?

sql-server - 使用 Case 或 Join 的 TSQL Select 语句

SQL Server - sp_procoption 用参数标记过程

python - 在 python 中构建不同的对

algorithm - 寻找具有最大交集的子集的组合

matlab - 多项式系数的高效 Matlab 实现

c - 为什么执行时显示为82? For 循环 - 阶乘

sql-server - 从组中选择最低的 n 个值

t-sql - 从表中删除所有唯一键 - T-SQL

python - 字典中 4 个和 3 个元素的组合