DAX 运行 基于 3 列的总计,其中一列是重复整数 运行 总计

DAX running total based on 3 columns, one of which is a repeating integer running total

对 DAX/PowerPivot 很陌生,第一天就遇到了非常棘手的问题。

我有一些数据(90,000 行),我试图用它来计算民间轮班的累积疲劳分数(使用 PowerPivot/Excel 2016)。根据下面的屏幕截图,数据集是多个员工的轮班数据,其中包含工作天数与休息天数的累计计数,每当他们从一种状态切换到另一种状态时,该数据就会重置回 1,还有一个 'Score' 列在我的生产数据中包含衡量他们疲劳程度的指标。

我想累加疲劳分数,并在它们在 'Days worked' 和 'Days off' 状态之间移动时重置它。我想要的输出在最右边的 'Desired' 列中,我使用绿色突出显示来显示工作天数和休息天数,并在单独的 Emp_ID 块周围放置了粗体边框以帮助演示数据.

我的问题与 DAX running total (or count) across 2 groups except that one of my columns (i.e. the Cumulative Days one) is in a repeating sequence from 1 to x. And Javier Guillén's post 的 SO post 之间有一些相似之处,如果我有几个月的 DAX 经验,而不是我今天获得的几个小时。

鉴于我是 DAX 新手(我的背景是 VBA、SQL 和 Excel 公式,我几乎无法开始概念化 DAX 需要是什么样子).但为了避免有人指责我甚至没有提供起点,我尝试调整以下 DAX,但实际上并不知道我在做什么:

 Cumulative:=CALCULATE( 
SUM( Shifts[Score] ) , 
FILTER(Shifts,Shifts[Cumulative Days] <= VALUES(Shifts[Cumulative Days] )) , 
ALLEXCEPT( shifts, Shifts[Workday],Shifts[EMP_ID] ) )

现在我将第一个承认此代码是 Infinite Monkey Theorem 的 DAX 等效代码。唉,我今天没有香蕉,我唯一的希望是有人发现这个问题适合 a-peeling。

此 table 的问题是在执行累计总计时无法确定何时停止求和。

我认为实现它的一种方法可能是计算连续工作日状态发生变化的下一个第一个日期。

例如 EMP_ID 70073 的前三行工作日状态相同,直到第四行日期 04-May 是工作日状态更改的日期。我的想法是创建一个计算列来查找每个工作日系列的状态更改日期。该列让我们实现累计和。

下面是我命名为 Helper.

的计算列的表达式
Helper =
IF (
    ISBLANK (
        CALCULATE (
            MIN ( [Date] ),
            FILTER (
                'Shifts',
                'Shifts'[EMP_ID] = EARLIER ( 'Shifts'[EMP_ID] )
                    && 'Shifts'[Workday] <> EARLIER ( 'Shifts'[Workday] )
                    && [Date] > EARLIER ( 'Shifts'[Date] )
            )
        )
    ),
    CALCULATE (
        MAX ( [Date] ),
        FILTER (
            Shifts,
            Shifts[Date] >= EARLIER ( Shifts[Date] )
                && Shifts[EMP_ID] = EARLIER ( Shifts[EMP_ID] )
        )
    )
        + 1,
    CALCULATE (
        MIN ( [Date] ),
        FILTER (
            'Shifts',
            'Shifts'[EMP_ID] = EARLIER ( 'Shifts'[EMP_ID] )
                && 'Shifts'[Workday] <> EARLIER ( 'Shifts'[Workday] )
                && [Date] > EARLIER ( 'Shifts'[Date] )
        )
    )
)

简而言之,该表达式表示如果当前工作日系列的日期计算更改 returns a blank 使用该 EMP_ID 的最后日期并添加一个日期。

请注意,无法计算最后一个工作日系列的更改日期,在本例中为 08-May 行,因此如果计算 return 为空,则表示它正在评估最后一个系列然后我的表达应该 return 最大日期 EMP_ID 添加一天。

计算列位于 table 中后,您可以使用以下表达式为累积值创建度量:

Cumulative Score =
CALCULATE (
    SUM ( 'Shifts'[Score] ),
    FILTER ( ALL ( 'Shifts'[Helper] ), [Helper] = MAX ( [Helper] ) ),
    FILTER ( ALL ( 'Shifts'[Date] ), [Date] <= MAX ( [Date] ) )
)

在 Power BI 的 table 中(我至少有八个小时无法访问 PowerPivot)结果是这样的:

我认为有一个更简单的解决方案,我的第一个想法是使用变量,但仅在 DAX 2015 中受支持,您很可能没有使用 Excel 2016。

更新: 在度量计算中只留下一个过滤器。 FILTER 是遍历整个 table 的迭代器,因此仅使用一个过滤器和逻辑运算符可以提高性能。

Cumulative Score =
CALCULATE (
    SUM ( 'Shifts'[Score] ),
    FILTER (
        ALL ( 'Shifts'[Helper], Shifts[Date] ),
        [Helper] = MAX ( [Helper] )
            && [Date] <= MAX ( [Date] )
    )
)

更新 2: 枢轴 tables(矩阵)的解决方案,因为之前的表达式仅适用于表格可视化。还优化了测量表达式以仅实现一个过滤器。

这应该是枢轴的最终表达式 table:

Cumulative Score =
CALCULATE (
    SUM ( 'Shifts'[Score] ),
    FILTER (
        ALLSELECTED ( Shifts ),
        [Helper] = MAX ( [Helper] )
            && [EMP_ID] = MAX ( Shifts[EMP_ID] )
            && [Date] <= MAX ( Shifts[Date] )
    )
)

Note: If you want to ignore filters use ALL instead of ALLSELECTED.

Power BI 矩阵中的结果:

结果 PowerPivot 枢轴 Table:

如果有帮助请告诉我。