【问题标题】:Count datetime intervals which contains timestamp with DAX使用 DAX 计算包含时间戳的日期时间间隔
【发布时间】:2019-11-18 15:57:47
【问题描述】:

我有两张桌子:

包含日期和时间的日历表。

还有一个包含事件的表,除了一组属性(在示例表中只有一个,事件代码)之外,还有开始时间和结束时间。

对于特定的日期范围,我想显示每小时发生了多少事件。

以下措施有效,但当事件表变大并且有多个切片器时会遇到困难

incidentCnt = 
CALCULATE(
    COUNTROWS(incidents);
    FILTER(
        incidents;
        incidents[start_datetime] < MAX(date_hour[datetime]) &&
            incidents[end_datetime] > MAX(date_hour[datetime])
    )
)

在 Power BI 中使用 DAX 进行计算的更有效方法是什么?

编辑:此表达式将适用于上面提供的数据(对已接受的答案进行少量编辑)。

Expanded_Incidents = 
GENERATE(
    incidents;
    SELECTCOLUMNS(
        GENERATESERIES(
            DATE(
                YEAR(incidents[start_datetime]);
                MONTH(incidents[start_datetime]);
                DAY(incidents[start_datetime])
            ) + TIME(HOUR(incidents[start_datetime]);0;0);
            incidents[end_datetime];
            TIME(1;0;0)
        );
        "Expanded_incident_time"; [Value]
    )
)

【问题讨论】:

    标签: powerbi dax powerbi-desktop


    【解决方案1】:

    更有效的方法是扩展事件表,以便每个事件在开始日期时间和结束日期时间之间的每个时间都发生。您可以使用这样的计算表来做到这一点:

    Expanded_Incidents = 
    GENERATE(
        incidents;
        SELECTCOLUMNS(
            GENERATESERIES(
                incidents[start_date];
                incidents[end_date];
                TIME(h;m;s)
            );
            "Expanded_incident_time"; [Value]
        )
    )
    

    将TIME(h;m;s) 更改为您选择的时间分辨率。

    然后在您的 dateTime 暗表和 [Expanded_incident_time] 列之间建立关系(这应该是 1:*)。然后你只需要做一个计算新表中行数的度量。这将为您提供特定时间段内活动事件的数量,我相信它会比每次重复表格更快。

    【讨论】:

    • 这可以大大加快速度,甚至可以处理大型数据集。我尝试在我的事件表中使用 10 000 000 行,甚至添加了另外两个具有 10 000 和 380 000 个不同值的属性。生成的 Expanded_Incidents 表有 69 762 000 行。加载需要一些时间,但报告非常敏感。我还尝试使用 power query 扩展事件表,效果很好,但生成了一个更大的 *.pbi 文件(430MB vs 200MB)。不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多