具有多次迭代的SQL CTE递归

具有多次迭代的SQL CTE递归,sql,mariadb,common-table-expression,recursive-query,Sql,Mariadb,Common Table Expression,Recursive Query,我在理解CTE递归方面有问题。假设我想计算二项式系数。我的猜测是我需要两个CTE,因为我想有一个生成表的CTE,所有值都在某个范围内,例如,要得到4,2,我需要有3,2和3,1,等等,第二个CTE是所有值的总和?我迷路了——我不仅需要在n上迭代,还需要在k上迭代。如果我从0,0开始,然后用之前的计算,1,1,2,0,2,1计算,那就好了。 问题是我不知道怎么做。我试着做了两个CTE,但我不知道如何迭代这两个CTE。这有什么诀窍吗? 还有,我在想-也许从n,0开始,然后n,1,n,2。。。但要做到

我在理解CTE递归方面有问题。假设我想计算二项式系数。我的猜测是我需要两个CTE,因为我想有一个生成表的CTE,所有值都在某个范围内,例如,要得到4,2,我需要有3,2和3,1,等等,第二个CTE是所有值的总和?我迷路了——我不仅需要在n上迭代,还需要在k上迭代。如果我从0,0开始,然后用之前的计算,1,1,2,0,2,1计算,那就好了。 问题是我不知道怎么做。我试着做了两个CTE,但我不知道如何迭代这两个CTE。这有什么诀窍吗? 还有,我在想-也许从n,0开始,然后n,1,n,2。。。但要做到这一点,我还需要其他二项式系数。 我用的是Mariadb,如果这和这里有关的话

编辑: 这是我写的东西,显然它不起作用,我想摆弄递归

WITH RECURSIVE
kiterate (n, k, res) AS
(
SELECT 0, 0, 1 
UNION ALL 
SELECT n, k+1, 0 -- there should be result 
FROM kiterate WHERE n < k
)
SELECT * FROM kiterate;


但我想得到这样的东西。我有n,我有k,现在我需要做的是生成结果。要做到这一点,我需要计算几乎所有的东西,直到我达到0,0,或者可能没有必要?。我不喜欢的东西;我不明白如何在n和k上迭代。如上所述,如果我想计算4,2,我需要0,0,1,0,1,2,2,2,3,0,3,1,3,2,3,我不确定所有这些,但我希望你能理解。所以我必须改变n和k。但不是同时。类似if语句的语句会很好,但我很确定这里不是这样。

问题是如何在SQL中计算二项式系数。Cn,k的典型公式是n!/k!/好的

在SQL中,一种方法对每个阶乘使用一个递归CTE,如下所示:

with recursive 
    params as (select 4 n, 2 k),
    r1 as (
        select n, n res from params
        union all select n - 1, res * (n - 1) from r1 where n > 1
    ),
    r2 as (
        select k, k res from params
        union all select k - 1, res * (k - 1) from r2 where k > 1
    ),
    r3 as (
        select (n - k) m, (n - k) res from params 
        union all select m - 1, res * (m - 1) from r3 where m > 1
    )
select max(r1.res) / max(r2.res) / max(r3.res) 
from r1
cross join r2
cross join r3   
参数CTE给出了计算的参数——这里是C4,2。然后三个CTE中的每一个计算一个阶乘,外部查询执行最终计算


:C4,2是6。

问题是如何在SQL中计算二项式系数。Cn,k的典型公式是n!/k!/好的

在SQL中,一种方法对每个阶乘使用一个递归CTE,如下所示:

with recursive 
    params as (select 4 n, 2 k),
    r1 as (
        select n, n res from params
        union all select n - 1, res * (n - 1) from r1 where n > 1
    ),
    r2 as (
        select k, k res from params
        union all select k - 1, res * (k - 1) from r2 where k > 1
    ),
    r3 as (
        select (n - k) m, (n - k) res from params 
        union all select m - 1, res * (m - 1) from r3 where m > 1
    )
select max(r1.res) / max(r2.res) / max(r3.res) 
from r1
cross join r2
cross join r3   
参数CTE给出了计算的参数——这里是C4,2。然后三个CTE中的每一个计算一个阶乘,外部查询执行最终计算


:C4,2是6。

我在这里看不到问题。你们有样本数据和期望的结果吗?我想计算,例如,二项式系数5,3。所以我想得到的是结果。我开始写CTE,但似乎我遗漏了什么。我将对我的问题进行编辑,使其更加清晰。我在这里没有看到任何问题。你们有样本数据和期望的结果吗?我想计算,例如,二项式系数5,3。所以我想得到的是结果。我开始写CTE,但似乎我遗漏了什么。我将编辑我的问题以使其更清楚。谢谢,我将分析此代码。但是如果我真的想使用递归定义呢?@Awerde:你的问题提到你想计算二项式系数,所以这就是查询的作用。如果你想要组合列表,那么这是一个完全不同的问题。@GMB我认为他想要的不是通过直接公式,而是通过递归公式,例如:Cn,k=Cn-1,k-1+Cn-1,k,直到我们达到以下条件之一:Cn,0=Cn,n=1。谢谢你,我将分析这段代码。但是如果我真的想使用递归定义呢?@Awerde:你的问题提到你想计算二项式系数,所以这就是查询的作用。如果你想要组合列表,那是一个完全不同的问题。@GMB我认为他想要的不是通过直接公式,而是通过递归公式,例如:Cn,k=Cn-1,k-1+Cn-1,k,直到我们达到以下条件之一:Cn,0=Cn,n=1。