使用日期 table 的期末进行中事件的 dax

dax for events in progress at end of period using date table

我需要按日期汇总所有开放机会的总金额。每条记录都附有一个 [valid from] 和一个 [valid to] 日期。当数据库中的机会更新时,将添加一个新行,其中包含 [valid from] date = today 和 [valid to] date = end of time (12/31/2100)。上一行的 [valid to] 日期为昨天的日期。

推理:因为机会每天可以更改多次,所以我们只关心每天超过 11:59:59 阈值的版本。当机会发生变化时,之前的版本仅在前一天结束前有效,因此它的 [valid to] 字段获取前一天的日期。

当按大于日期的单位细分时,我需要当时机会的最后一个正确版本。例如,1 月份的美元金额是 1 月 31 日 11:59:59.

机会的最新美元价值的金额

这是我的架构的简化版本:

这是一些示例数据:

Opp Number  Dollars Opp Created Date    Header Valid From   Header Valid To
1           100         1/1/2019        1/1/2019            1/3/2019
1           50          1/1/2019        1/4/2019            1/5/2019
1           75          1/1/2019        1/6/2019            12/31/2100
2           200         1/3/2019        1/3/2019            1/4/2019
2           210         1/3/2019        1/5/2019            1/6/2019
2           250         1/3/2019        1/7/2019            12/31/2100

给定此示例数据集,主元 table 应如下所示:

Dates   Sum of Dollars
1/1/2019    100
1/2/2019    100
1/3/2019    300
1/4/2019    250
1/5/2019    260
1/6/2019    285
1/7/2019    325
1/8/2019    325
...
1/31/2019   325
January     325

我尝试了几种方法,但都无济于事。以下是我尝试过的参考资料:

我能够让它在 dax studio 中按预期工作,但我无法将其转化为度量。

EVALUATE
ADDCOLUMNS (
    VALUES ( 'DIM Date'[Date]),
    "Open Orders",
    SUMX (
        FILTER (
            GENERATE (
                SUMMARIZE (
                    'FACT Opportunity',
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to],
                    "Rows",
                    DISTINCTCOUNT ( 'FACT Opportunity'[Opp Number])
                ),
                DATESBETWEEN (
                    'DIM Date'[Date],
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to]
                )
            ),
            'DIM Date'[Date] = EARLIER ('DIM Date'[Date])
        ),
        [Rows]
    )
)

我明白了。我缺少一个 A​​LL() 函数来消除由 CALCULATE() 函数完成的上下文转换。我还在 VALUES() 函数周围使用 LASTDATE() 来获取任何给定上下文中的最后日期。这给了我层次结构中任何给定 month/qtr/year 中最后日期的总和。
这是我使用的代码:

Active Opps:=
SUMX(
    LASTDATE( VALUES ( 'DIM Date'[Date] ) ),
    VAR CurrentDate = 'DIM Date'[Date]
    VAR OrderedBeforeCurrentDate =
        FILTER (
            ALL ( 'FACT Opportunity'[header valid from]), 
            'FACT Opportunity'[header valid from] <= CurrentDate 
        )
    VAR ShippedAfterCurrentDate =
        FILTER (
            ALL ( 'FACT Opportunity'[header valid to] ), 
            'FACT Opportunity'[header valid to] >= CurrentDate 
        )
    RETURN
        CALCULATE (
            DISTINCTCOUNT( 'FACT Opportunity'[Opp Number]),
            OrderedBeforeCurrentDate,
            ShippedAfterCurrentDate,
            ALL ( 'DIM Date' )
        )
)

在此处找到模式:https://www.sqlbi.com/articles/analyzing-events-with-a-duration-in-dax/