我不知道这是否可能,但我希望能够创建一个计算列,其中每行都依赖于其上方的行。
一个典型的例子是斐波那契数列 https://en.wikipedia.org/wiki/Fibonacci_number,其中序列由递归关系定义F(n) = F(n-1) + F(n-2)
和种子F(1) = F(2) = 1
.
以表格形式,
Index Fibonacci
----------------
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
... ...
我希望能够构建Fibonacci
列作为计算列。
现在,我知道斐波那契序列有一个很好的封闭形式,我可以在其中定义
Fibonacci = (((1 + SQRT(5))/2)^[Index] - ((1 - SQRT(5))/2)^[Index])/SQRT(5)
或使用帕斯卡三角形形式的浅对角线 https://en.wikipedia.org/wiki/Fibonacci_number#Use_in_mathematics:
Fibonacci =
SUMX (
ADDCOLUMNS (
SELECTCOLUMNS (
GENERATESERIES ( 0, FLOOR ( ( [Index] - 1 ) / 2, 1 ) ),
"ID", [Value]
),
"BinomCoeff", IF (
[ID] = 0,
1,
PRODUCTX (
GENERATESERIES ( 1, [ID] ),
DIVIDE ( [Index] - [ID] - [Value], [Value] )
)
)
),
[BinomCoeff]
)
但对于一般的递归定义函数来说,情况并非如此(或者出于我实际上有兴趣使用它的目的)。
在 Excel 中,这很容易做到。你会写一个这样的公式
A3 = A2 + A1
或以 R1C1 表示法,
= R[-1]C + R[-2]C
但我就是不知道这在 DAX 中是否可行。
我尝试过的所有方法要么不起作用,要么给出循环依赖错误。例如,
Fibonacci =
VAR n = [Index]
RETURN
IF(Table1[Index] <= 2,
1,
SUMX(
FILTER(Table1,
Table1[Index] IN {n - 1, n - 2}),
Table1[Fibonacci]
)
)
给出错误消息
检测到循环依赖:表 1[Fibonacci]。
Edit:
在 Marco Russo 和 Alberto Ferrari 所著的《Microsoft SQL Server Analysis Services 中的表格建模》一书中,对 DAX 进行了描述并包含以下段落:
作为一种纯函数式语言,DAX 没有命令式语句,但它利用了称为迭代器为给定表表达式的每一行执行特定表达式。这些参数与函数式语言中的 lambda 表达式很接近。但是,组合它们的方式存在限制,因此我们不能说它们对应于通用 lambda 表达式定义。尽管具有函数性质,DAX 不允许您定义新函数,也不提供递归。
看来没有直接的方法来进行递归。我仍然想知道是否有办法仍然以某种方式间接地使用父子函数 https://msdn.microsoft.com/en-us/query-bi/dax/understanding-functions-for-parent-child-hierarchies-in-dax,这看起来本质上是递归的。
Edit 2:
虽然一般递归似乎不可行,但不要忘记递归公式可能有一个很好的封闭形式,可以相当容易地导出。
以下是我使用此解决方法来回避递归公式的几个示例:
如何在PowerBI中对同一列的先前单元格进行求和 https://stackoverflow.com/questions/61257536/
DAX - 公式引用自身 https://stackoverflow.com/questions/60641059