gpt4 book ai didi

dax - DAX 中的递归

转载 作者:行者123 更新时间:2023-12-04 04:36:32 27 4
gpt4 key购买 nike

我不知道这是否可行,但我希望能够创建一个计算列,其中每一行都依赖于它上面的行。

一个典型的例子是 Fibonacci sequence ,其中序列由递推关系 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)

或使用 shallow diagonals of Pascal's triangle form :
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]
)
)

给出错误信息

A circular dependency was detected: Table1[Fibonacci].



编辑:

在 Marco Russo 和 Alberto Ferrari 所著的 Microsoft SQL Server 分析服务中的表格建模一书中,DAX 进行了描述并包括以下段落:

As a pure functional language, DAX does not have imperative statements, but it leverages special functions called iterators that execute a certain expression for each row of a given table expression. These arguments are close to the lambda expression in functional languages. However, there are limitations in the way you can combine them, so we cannot say they correspond to a generic lambda expression definition. Despite its functional nature, DAX does not allow you to define new functions and does not provide recursion.



似乎没有直接的方法来进行递归。我仍然想知道是否有办法仍然使用 Parent-Child functions 以某种方式间接地做到这一点。 ,这在本质上似乎是递归的。

编辑 2:

虽然一般递归似乎不可行,但不要忘记递归公式可能有一个很好的封闭形式,可以很容易地推导出来。

以下是我使用此解决方法来回避递归公式的几个示例:

How to perform sum of previous cells of same column in PowerBI

DAX - formula referencing itself

最佳答案

根据您的第一个示例数据集,它在我看来就像“某种”累积总计,它可能可以使用 WINDOW 函数在 SQL 中轻松计算——我尝试了几件事,但还没有解决。我对 DAX 的工作还不足以说它是否可以完成。

编辑:在仔细审查 Fibonacci sequence ,原来我的SQL进行累积比较的代码不正确。您可以阅读 SO Post How to generate Fibonacci Series ,它有几个不错的SQL Fibonacci我测试过的答案;特别是 N J - answered Feb 13 '14 的帖子.我不确定 DAX Fibonacci递归函数能力。

SQL 代码(不太正确):

DECLARE @myTable as table (Indx int)

INSERT INTO @myTable VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)

SELECT
Indx
,SUM(myTable.Indx) OVER(ORDER BY myTable.Indx ASC ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) -- + myTable.Indx
AS [Cummulative]
,SUM(myTable.Indx) OVER(ORDER BY myTable.Indx ASC ROWS BETWEEN UNBOUNDED PRECEDING and 2 PRECEDING)
+ SUM(myTable.Indx) OVER(ORDER BY myTable.Indx ASC ROWS BETWEEN UNBOUNDED PRECEDING and 1 PRECEDING)
AS [Fibonacci]
from @myTable myTable

结果集:
+------+-------------+-----------+
| Indx | Cummulative | Fibonacci |
+------+-------------+-----------+
| 1 | 1 | NULL |
+------+-------------+-----------+
| 2 | 3 | NULL |
+------+-------------+-----------+
| 3 | 6 | 4 |
+------+-------------+-----------+
| 4 | 10 | 9 |
+------+-------------+-----------+
| 5 | 15 | 16 |
+------+-------------+-----------+
| 6 | 21 | 25 |
+------+-------------+-----------+
| 7 | 28 | 36 |
+------+-------------+-----------+
| 8 | 36 | 49 |
+------+-------------+-----------+
| 9 | 45 | 64 |
+------+-------------+-----------+
| 10 | 55 | 81 |
+------+-------------+-----------+

DAX 累计:

一个可以帮助使用 DAX 计算累计总数的链接-- https://www.daxpatterns.com/cumulative-total/ .这是文章中的一些示例代码。
Cumulative Quantity :=
CALCULATE (
SUM ( Transactions[Quantity] ),
FILTER (
ALL ( 'Date'[Date] ),
'Date'[Date] <= MAX ( 'Date'[Date] )
)
)

关于dax - DAX 中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52766022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com