计算列函数类似于 DAX 中的回头客度量

calculated column function similar to returning customer measure in DAX

我正在尝试开发 DAX 计算列,以指示培训师分配随时间的变化。我对 Power BI 和 DAX 比较陌生。下面是一个事实 table 的例子。现在,我正在查看一位培训师 (Mario),并根据访问日期和培训师列比较人员是否仍分配给他、新分配或删除分配。

我将创建一个仪表板,但在最简单的视图中,我希望输出如下所示(以及最近的访问日期):

其中 "newly assigned" 如果前一次访问日期列出了不同的培训师并且现在列出了 Mario 或者这是第一次访问,"still assigned" 如果最近两次访问都是与 Mario,和 "assignment removed" 如果在马里奥之后列出了另一位培训师。

在搜索在线论坛后,我认为这类似于 returning/lost 客户度量,这些度量很容易获得,但我需要行级别的输出,所以我认为我需要使用计算列。基于这些搜索,我创建了一个列,如果马里奥是训练师则输出 1,并尝试在另一列中使用 MIN/MAX,但没有用。

这是工作计算列:

Mario = 
VAR IfMario = CALCULATE (
    FIRSTNONBLANK( fact[Trainer], 1),
    FILTER( ALL (fact[ID]), fact[ID] = "Mario" )
)

RETURN
SWITCH (
TRUE(),
IfMario = "Mario", 1,
0
     )

我不确定如何从这里开始。感谢您的帮助!

要创建这样的视图,您不需要计算列(除非您有问题中未提及的其他原因)。措施将更容易建立。

措施 1:

Last Visit Date = MAX(fact[Date])

措施 2:

Current Trainer    =
VAR Current_Date = [Last Visit Date]
RETURN
    CALCULATE ( VALUES ( fact[Trainer] ), fact[Date] = Current_Date )

措施 3:

Previous Trainer    =
VAR Current_Date = [Last Visit Date]
VAR Previous_Date = CALCULATE ( MAX ( fact[Date] ), fact[Date] < Current_Date )
RETURN
    CALCULATE ( VALUES ( fact[Trainer] ), fact[Date] = Previous_Date )

措施 4:

Category    =
SWITCH (
    TRUE (),
    [Current Trainer] =  "Mario" && [Previous Trainer] =  "Mario", "Still Assigned",
    [Current Trainer] =  "Mario" && [Previous Trainer] <> "Mario", "Newly Assigned",
    [Current Trainer] <> "Mario" && [Previous Trainer] =  "Mario", "Assignement Removed"
)

将名称放在矩阵行上,将度量 4 和 1 放到值中,您将得到报告。

备注:

  • 我认为提供的示例包含错误(Jon Snow 类别应该是 'Assignment Removed',而不是 'Newly assigned';
  • 无需硬编码"Mario",可以是动态选择的Trainer;
  • 代码依赖于每个日期每个名字一个培训师的假设,否则你会得到一个错误(你可以通过使用 If(Hasonevalue[fact[Trainer]], ...

[编辑:防止多个培训师错误]

如果您遇到客户在同一日期可能有多个培训师的情况,则 VALUES 将 return 多于 1 个培训师,这会产生错误。可能的解决方案:

Current Trainer Count:=
VAR Current_Date = [Most Recent]
RETURN  
    COUNTROWS( CALCULATETABLE(Customer, Customer[Date] = Current_Date ))

此类措施将 return 每个客户的当前培训师数量。然后修改[Current Customer]度量:

Current Trainer:=
VAR Current_Date = [Most Recent]
RETURN
 IF([Current Trainer Count] = 1,  
     CALCULATE( VALUES(Customer[Trainer]), Customer[Date] = Current_Date ),
     "Multiple Trainers")

而不是 "Multiple Trainers" 文本,您可以 return 任何您需要的内容。例如,您可以 return 当前培训师人数:

Current Trainer:=VAR Current_Date = [Most Recent]
RETURN
  IF([Current Trainer Count] = 1,  
     CALCULATE( VALUES(Customer[Trainer]), Customer[Date] = Current_Date ),
     [Current Trainer Count] & " trainers"    )

因此,测量将 return“2 位培训师”,而不是 "multiple trainers",等等

另一种方法是将所有培训师连接到一个分隔列表中。例如:

Current Trainer=
VAR Current_Date = [Most Recent]
RETURN
    CONCATENATEX (
        CALCULATETABLE ( Customer, Customer[Date] = Current_Date ),
        Customer[Trainer], "," )

这样的措施不需要保护,因为如果有多个培训师,它会简单地列出所有培训师:

Current Trainer
"Mario, Yoshi"

当然,你也可以在报告中使用"Current Trainer Count",快速查看此类场景。

同样的逻辑也适用于之前的培训师。

最后,您需要保护您的 [Category] ​​指标免受多训练者场景的影响。例如:

Status=
IF([Current Trainer Count] > 1 || [Previous Trainer Count] > 1, "Multiple Trainers", 
SWITCH
(TRUE(),
[Current Trainer] = "Mario" && [Previous Trainer] = "Mario", "Same",
[Current Trainer] = "Mario" && [Previous Trainer] <> "Mario","New",
[Current Trainer] <> "Mario" && [Previous Trainer] = "Mario", "Lost"
))