基于DAX中聚合函数的LOOKUPVALUE

时间:2018-11-19 17:40:32

标签: dax powerpivot powerquery m

我需要一个计算所得的列(因为它将在切片器中使用),该列返回员工的最新主管。

数据样本(表“性能”):

EMPLOYEE    |   DATE        |   SUPERVISOR
--------------------------------------------
Jim         |   2018-11-01  |   Bob
Jim         |   2018-11-02  |   Bob
Jim         |   2018-11-03  |   Bill
Mike        |   2018-11-01  |   Steve
Mike        |   2018-11-02  |   Gary

所需的输出:

EMPLOYEE    |   DATE         |  SUPERVISOR  |   LAST SUPER
---------------------------------------------------------------
Jim         |   2018-11-01   |  Bob         |   Bill
Jim         |   2018-11-02   |  Bob         |   Bill
Jim         |   2018-11-03   |  Bill        |   Bill
Mike        |   2018-11-01   |  Steve       |   Gary
Mike        |   2018-11-02   |  Gary        |   Gary

我尝试使用

LAST SUPER =
LOOKUPVALUE (
    Performance[SUPERVISOR],
    Performance[DATE], MAXX ( Performance, [DATE] )
)

但是我得到了错误:

  

“性能”列中的计算错误[]:多个表   在期望使用单个值的地方提供了值。

进行更多研究后,看来这种方法从一开始就注定要失败。根据{{​​3}},搜索值不能引用正在搜索的同一表中的任何列。但是,即使当我将搜索值更改为TODAY()或将一个静态日期作为测试时,我也遇到了关于多个值的相同错误。 MAXX()还将返回整个表中的最长日期,而不仅仅是返回给该员工。

我想知道这是否是很多问题,所以我回到Power Query,复制原始查询,由EMPLOYEE分组以获得MAX(DATE),将两个字段与原始查询进行匹配,以在MAX上获得SUPERVISOR (DATE),可以将其视为常规查找表。虽然可以正常工作,但刷新速度明显变慢也就不足为奇了。

我无法确定我是否过于复杂,过度简化,或者只是采用任何一种方法都大大超出了标准,但我将不胜感激。

我想知道的是:

  1. 是否可以使用像LOOKUPVALUES()这样的简单函数来获得所需的输出?
  2. 如果没有,是否有比重复查询更有效的方法?

1 个答案:

答案 0 :(得分:1)

LOOKUPVALUE给出该特定错误的原因是它正在对整个表进行查找,而不仅是与该特定员工相关联的行。因此,如果您有多个主管匹配相同的最大日期,那么您就会遇到问题。

如果您想为此使用LOOKUPVALUE函数,则建议以下操作:

Last Super = 
VAR EmployeeRows =
    FILTER( Performance, Performance[Employee] = EARLIER( Performance[Employee] ) )
VAR MaxDate = MAXX( EmployeeRows, Performance[Date] )
RETURN
LOOKUPVALUE(
    Performance[Supervisor],
    Performance[Date], MaxDate,
    Performance[Employee], Performance[Employee]
)

这里有两个主要区别。

  1. 我只为该特定员工(EmployeeRows)的行获取最长日期。
  2. 我将Employee包含在查找功能中,以便 仅匹配合适的员工。

有关其他可能的解决方案,请参见以下问题:

Return top value ordered by another column