Loops 为计算列循环工作DAX函数
我有一个函数,它将查看“Project Commit Cap”列中的null字段,并查找具有相同ID和下一个较早日期的值,并为“Project Commit Cap NoNulls”列提供该值。DAX不会递归地执行此操作,因此如果一行中有2个空值,我将得到一个空值。在另一种语言中,一个简单的while循环(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函数应用填充的值并保持运行,直到没有更多的空值 (可选)我如何强制
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]
)