Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 为计算列循环工作DAX函数_Loops_Powerbi_Dax - Fatal编程技术网

Loops 为计算列循环工作DAX函数

Loops 为计算列循环工作DAX函数,loops,powerbi,dax,Loops,Powerbi,Dax,我有一个函数,它将查看“Project Commit Cap”列中的null字段,并查找具有相同ID和下一个较早日期的值,并为“Project Commit Cap NoNulls”列提供该值。DAX不会递归地执行此操作,因此如果一行中有2个空值,我将得到一个空值。在另一种语言中,一个简单的while循环(while value为null do:XYZ)可以解决这个问题,但是DAX不支持For/while循环 我如何让工作的DAX函数应用填充的值并保持运行,直到没有更多的空值 (可选)我如何强制

我有一个函数,它将查看“Project Commit Cap”列中的null字段,并查找具有相同ID和下一个较早日期的值,并为“Project Commit Cap NoNulls”列提供该值。DAX不会递归地执行此操作,因此如果一行中有2个空值,我将得到一个空值。在另一种语言中,一个简单的while循环(
while value为null do:XYZ
)可以解决这个问题,但是DAX不支持For/while循环

我如何让工作的DAX函数应用填充的值并保持运行,直到没有更多的空值

(可选)我如何强制它运行X次(可能10次)?这不是一个很好的解决方案,但可以完成工作

下面的示例表被筛选为仅显示一个2 ID,不同ID的记录位于此处显示的记录之间,因此我无法执行类似excel的函数“从下面的行中获取值”

以下是将填充上一个值的DAX函数(如上图所示):

ProjectCommitCap\u NoNulls=
如果(
ISBLANK(‘项目故事数据’[预计承诺上限]),
查找值(
“项目故事数据”[预计承诺上限],
“项目故事数据”[ID],“项目故事数据”[ID],
“项目故事数据”[数据日期],计算(
最大值(‘项目故事数据’[数据日期]),
滤器(
“项目故事数据”,
'项目故事数据'[ID]=早期('项目故事数据'[ID])
&&“项目故事数据”[数据日期]
<更早('项目故事数据'[数据日期])
)
)
),
“项目故事数据”[预计承诺上限]
)
我需要如下所示(填写非整数中的所有值):


DAX实际上根本不做循环,但我认为您可以修改公式以查找最后一个非空日期,而不仅仅是前一个日期

ProjectCommitCap_NoNulls =
IF (
    ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ),
    LOOKUPVALUE (
        'Project Story Data'[Projected Commitments Cap],
        'Project Story Data'[ID], 'Project Story Data'[ID],
        'Project Story Data'[Date of Data], CALCULATE (
            MAX ( 'Project Story Data'[Date of Data] ),
            FILTER (
                'Project Story Data',
                'Project Story Data'[ID] = EARLIER ( 'Project Story Data'[ID] )
                    && NOT ( ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ) )
                    && 'Project Story Data'[Date of Data]
                        < EARLIER ( 'Project Story Data'[Date of Data] )
            )
        )
    ),
    'Project Story Data'[Projected Commitments Cap]
)

ProjectCommitCap\u NoNulls=
如果(
ISBLANK(‘项目故事数据’[预计承诺上限]),
查找值(
“项目故事数据”[预计承诺上限],
“项目故事数据”[ID],“项目故事数据”[ID],
“项目故事数据”[数据日期],计算(
最大值(‘项目故事数据’[数据日期]),
滤器(
“项目故事数据”,
'项目故事数据'[ID]=早期('项目故事数据'[ID])
&&不是(ISBLANK(‘项目故事数据’[预计承诺上限])
&&“项目故事数据”[数据日期]
<更早('项目故事数据'[数据日期])
)
)
),
“项目故事数据”[预计承诺上限]
)

正如@greggyb所指出的,在查询编辑器中使用“填充”转换是一个更简单的解决方案

在DAX工作期间,您可能会发现此问答也很有用:
DAX实际上根本不做循环,但我认为您可以修改公式以查找最后一个非空日期,而不仅仅是前一个日期

ProjectCommitCap_NoNulls =
IF (
    ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ),
    LOOKUPVALUE (
        'Project Story Data'[Projected Commitments Cap],
        'Project Story Data'[ID], 'Project Story Data'[ID],
        'Project Story Data'[Date of Data], CALCULATE (
            MAX ( 'Project Story Data'[Date of Data] ),
            FILTER (
                'Project Story Data',
                'Project Story Data'[ID] = EARLIER ( 'Project Story Data'[ID] )
                    && NOT ( ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ) )
                    && 'Project Story Data'[Date of Data]
                        < EARLIER ( 'Project Story Data'[Date of Data] )
            )
        )
    ),
    'Project Story Data'[Projected Commitments Cap]
)

ProjectCommitCap\u NoNulls=
如果(
ISBLANK(‘项目故事数据’[预计承诺上限]),
查找值(
“项目故事数据”[预计承诺上限],
“项目故事数据”[ID],“项目故事数据”[ID],
“项目故事数据”[数据日期],计算(
最大值(‘项目故事数据’[数据日期]),
滤器(
“项目故事数据”,
'项目故事数据'[ID]=早期('项目故事数据'[ID])
&&不是(ISBLANK(‘项目故事数据’[预计承诺上限])
&&“项目故事数据”[数据日期]
<更早('项目故事数据'[数据日期])
)
)
),
“项目故事数据”[预计承诺上限]
)

正如@greggyb所指出的,在查询编辑器中使用“填充”转换是一个更简单的解决方案

在DAX工作期间,您可能会发现此问答也很有用:

“项目故事数据”[ProjectCommitCap\u NoNulls]=
如果(
ISBLANK(‘项目故事数据’[预计承诺上限]),
VAR CurrentRowDate='Project Story Data'[Date of Data]//表表达式,用于查找与之相同的[ID]的前一行的最近一行
//具有非空[项目承诺上限]
变量PriorNonNullRow=
可计算(
//TOPN返回一行,此处按[数据日期]排序
托普恩(
1.
“项目故事数据”,
“项目故事数据”[数据日期],描述
),
//ALLEXCEPT清除除[ID]之外的所有上下文,因此TOPN将
//评估具有相同[ID]的所有行的“项目故事数据”
ALLEXCEPT(
“项目故事数据”,
“项目故事数据”[ID]
),
//仅将其限制为小于当前行的[Date of Data]值
“项目故事数据”[数据日期]
使用这种方法应该对存储引擎更友好,因此比
LOOKUPVALUE
更易于缓存

“项目故事数据”[ProjectCommitCap\u NoNulls]=
如果(
ISBLANK(‘项目故事数据’[预计承诺上限]),
VAR CurrentRowDate='项目故事数据'[Da]
'Project Story Data'[ProjectCommitCap_NoNulls] =
IF (
    ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ),
    VAR CurrentRowDate = 'Project Story Data'[Date of Data] // Table expression to find the most recent prior row for same [ID] that
    // has non-null [Project Commitment Cap]
    VAR PriorNonNullRow =
        CALCULATETABLE (
            // TOPN returns one row, here sorted by the [Date of Data]
            TOPN (
                1,
                'Project Story Data',
                'Project Story Data'[Date of Data], DESC
            ),
            // ALLEXCEPT clears all context, except for [ID], so the TOPN will
            // evaluate 'Project Story Data' for all rows with the same [ID]
            ALLEXCEPT (
                'Project Story Data',
                'Project Story Data'[ID]
            ),
            // Restrict it to only the [Date of Data] values less than current row
            'Project Story Data'[Date of Data] < CurrentRowDate,
            // And restrict it to just rows with non-null values
            NOT ( ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ) )
        )
    RETURN
        // Using the table above as our filter context, find the MAX (or MIN, or VALUES -
        // it doesn't matter - just need to coerce the field to a scalar) of 
        // [Projected Commitments Cap]
        CALCULATE (
            MAX ( 'Project Story Data'[Projected Commitments Cap] ),
            PriorNonNullRow
        ),
    // This is arg3 of IF
    'Project Story Data'[Projected Commitments Cap]
)