只是根据过滤背景计数多的最新实例(Counting latest instance of multi

2019-09-29 04:35发布

我有发生在车辆,这会影响他们是否在服务或不在服务项的清单,该事件的一大桌。 我想创建一个措施,将能够在任何时间点来计算车辆在各类存货的数量,基于此表中的事件。

此表由一个SQL数据库中提取到一个Excel 2016片,而我使用的PowerPivot尝试拿出DAX措施。

下面是一些示例数据event_list

vehicle_id    event_date    event         event_sequence    inventory
100           2018-01-01    purchase      1                 in-service
101           2018-01-01    purchase      1                 in-service
102           2018-02-04    purchase      1                 in-service
100           2018-02-07    maintenance   2                 out-of-service
101           2018-02-14    damage        2                 out-of-service
101           2018-02-18    repaired      3                 in-service
100           2018-03-15    repaired      3                 in-service
102           2018-05-01    damage        2                 out-of-service
103           2018-06-03    purchase      1                 in-service

我希望能够在Excel中创建数据透视表(或使用CUBE功能等),以得到一个输出表是这样的:

date          in-service     out-of-service
2018-02-04    3              0
2018-02-14    1              2
2018-03-15    3              0
2018-06-03    3              1

从本质上讲,我希望能够基于在任何时间日期来计算库存。 这个例子只有几个日期,但希望提供足够的照片的。

我基本上想出这个,到目前为止,但它计算比预期更多的车辆 - 我无法弄清楚如何只需要最新的event_sequence或EVENT_DATE并用它来计算库存。

cumulative_vehicles_at_date:=CALCULATE(
    COUNTA([vehicle_id]),
    IF(IF(HASONEVALUE (event_list[event_date]), VALUES (event_list[event_date]))>=event_list[event_date],event_list[event_date])
)

我试着使用MAX()和早期()函数,但他们似乎并不管用。

编辑:添加为我现在使用的软件,试图解决这个问题,以及在PowerBI标签。 查看亚历克西斯·奥尔森的答复意见。

Answer 1:

我想我已经找到了一个更简洁的方法,比我以前给。


让我们添加两列到event_list表。 其中,其对车辆的"in-service"在该日期和一个用于计数车辆"out-of-service"在该日期。

InService = 
    VAR Summary = SUMMARIZE(
                      FILTER(event_list,
                          event_list[event_date] <= EARLIER(event_list[event_date])),
                      event_list[vehicle_id],
                      "MaxSeq", MAX(event_list[event_sequence]))

    VAR Filtered = FILTER(event_list,
                       event_list[event_sequence] =
                           MAXX(
                               FILTER(Summary,
                                   event_list[vehicle_id] = EARLIER(event_list[vehicle_id])),
                               [MaxSeq]))

    RETURN SUMX(Filtered, 1 * (event_list[inventory] = "in-service"))

您可以创建一个类似的计算列OutOfService或者你可以只取总减去InService计数。

OutOfService =
    CALCULATE(
        DISTINCTCOUNT(event_list[vehicle_id]),
        FILTER(event_list,
            event_list[event_date] <= EARLIER(event_list[event_date])))
    - event_list[InService]

现在你需要做的就是把event_date在矩阵可视行部分,并添加InServiceOutOfService列的值节(使用最大或最小的聚集选项,而不是总和)。


这里的计算列背后的逻辑InService

我们首先创建一个Summary ,它计算的最大表event_sequence每辆车价值。 (我们筛选event_date只考虑日期多达我们正在与目前的一个。)

现在我们知道了最后的event_sequence值是每个车辆,我们用它来过滤整个表下降到只有对应于那些车辆和序列值的行。 该过滤器经过由行,并检查表行,看序列值中计算出的一个匹配,我们Summary表。 需要注意的是,当我们筛选Summary表,只是我们目前正与车辆,我们只能得到单行。 我只是用MAXX提取[MaxSeq]值。 (这有点像使用LOOKUPVALUE ,但你不能使用一个变量。)

现在,我们已经过滤表只是最近发生的事件对每一辆车,我们需要做的是看看有多少人是"in-service" 。 我用了一个SUMX在这些地方1*(True/False)强制转换的布尔值返回10



Answer 2:

这是相当困难的。 我没有一个伟大的答案,但这里的东西种类的作品。

您将创建一个新的计算表在这里您可以计算每个日期每辆车的状态。 先从基础梁为每辆车每个加盟日期:

= CROSSJOIN(VALUES(event_list[vehicle_id]), VALUES(event_list[event_date]))

然后添加一个计算列找到在该日期每辆车最大的序列号。

Sequence = MAXX(
               FILTER(event_list,
                   event_list[event_date] <= Cross[event_date] &&
                   event_list[vehicle_id] = Cross[vehicle_id]),
               event_list[event_sequence])

现在可以查找用于与另一计算的列的每个车辆/序列对库存值:

Inventory = LOOKUPVALUE(
                event_list[inventory],
                event_list[vehicle_id], Cross[vehicle_id],
                event_list[event_sequence], Cross[Sequence]) 

结果应该是这个样子:

一旦你有了这个,你可以创建一个使用此计算表的矩阵。 把event_date的行和Inventory的列。 滤除空白存量值在视觉水平滤波器和把vehicle_id中的值字段中,使用计数或重复计数作为聚合方法(而不是默认的总和)。

它应该是这样的:



文章来源: Counting latest instance of multiple only based on filter context