计算事件持续时间以仅在切片周期内

Calculate Event Durations to only part within Sliced Period

我们正在研究 PowerBI 的报告解决方案,它可以满足我们的很多需求。但是,我们需要能够对事件进行临时报告。每个事件都有开始日期和结束日期以及总秒数并进行百分比计算等。这非常有效。

然而,我们的共同要求是指定我们希望考虑数据的开始日期和结束日期。许多事件将跨越所需时期的开始和结束,甚至在时期开始之前开始并超越结束。我们需要做的只是考虑落在周期内的那部分事件。

是否可以使用切片器来定义一个 start/end 周期,然后只包括为每个事件切片的周期内的秒数?

这将使我们能够计算该期间内所有事件的总时间。

更新

我的 table 包含数十万行,例如

EventID|VehicleID|StatusID|ReasonCodeID|StartDateTime|EndDateTime|TotalDuration

我们需要查看每个事件中属于选定时间段 ([​​=28=]) 的部分。然而,事件可以跨越多个时期。如果一个事件的一部分超出了一个时间段,我们想忽略那部分持续时间。如果整个事件在选定时间段之外,那么我们将忽略所有事件。

例如,某活动从 2 月 1 日开始,一直持续到 7 月 1 日。如果选择的切片器日期范围是 1 月 1 日到 3 月 1 日,那么我只想在总持续时间计算中包括 2 月 1 日到 3 月 1 日之间的时间

Is it possible to use a slicer to define a start/end period and then only include the number of seconds within the period sliced for each event?

是的,这是可能的。在 Power BI Gallery 中有一个自定义可视化效果,可让您过滤日期范围。

您只需将模型中的日期列拖放到 Timeline slicer 即可过滤您的度量。

要安装它,请转到库并在搜索框中搜索 timeline,下载它并将其导入 Power BI。

如果您对 DAX 表达式感到困惑,请在您的问题中包含 SQL 代码和示例模型。

如果有帮助请告诉我。

您的要求是可行的,但它的效果在很大程度上取决于您 table.

中的数据量

您可以使用 DAX 度量来计算给定日期内任何事件的持续时间总和。您可以使用您切片的断开连接日期 table 来执行此操作(2016 年 10 月 Power BI Desktop 版本包含一个内置数据切片器,可让您轻松选择一个范围)。更多信息请点击此处:https://powerbi.microsoft.com/en-us/blog/power-bi-desktop-october-feature-summary/#reportView

然后您将有一个 CALCULATE 度量值,该度量值对持续时间求和,并使用 FILTER 来确保相关事件落在切片器 select 编辑的日期范围内。这里有关于这部分问题的更多细节:Optimizing Dax & model for "where date between" type queries

但是,您要更进一步,因为您不想对给定日期范围内的事件的完整持续时间求和 - 您只想对给定日期内的事件持续时间求和范围。

为此,您必须根据 selected 日期范围在 运行 时间计算每一行的持续时间。您可以使用使用 SUMX 的度量来执行此操作(见下文),但在大量记录(数千、数百万)上,计算将开始变慢。

例如,如果您有一个名为 Date 的断开连接的日期 table,而您的事件 table 名为 Event,则您可以使用如下度量:

Filtered Duration =
CALCULATE (
    SUMX (
        Event,
        DATEDIFF (
            MAX ( MIN ( 'Date'[Date] ), Event[StartDateTime] ),
            MIN ( MAX ( 'Date'[Date] ), Event[EndDateTime] ),
            SECOND
        )
    ),
    FILTER (
        'Event',
        'Event'[StartDateTime] <= MAX ( 'Date'[Date] )
            && 'Event'[EndDateTime] >= MIN ( 'Date'[Date] )
    )
)

MIN('Date'[Date]) 在这种情况下,公式对应于 selected 日期范围内断开连接的日期 table 中的最早日期。 MAX('Date'[Date]) 对应最新日期。

最后一部分(过滤器)说 "only look at events that land on a date within the range selected"。 SUMX 表示 "for each row, do a DATEDIFF"。 DATEDIFF 中的 MAX 表示 "choose the later of either the first date from the slicer, or the start date of the event"。这样做的原因是,如果您在日期切片器上 select 从 15 日到 20 日,并且事件在 18 日开始,您希望从 18 日开始计数。但是,如果活动从 11 日开始,您会希望从 15 日开始计算。 MIN 与结束日期相反。

如果一个事件完全落在时间范围内,那么它将计算从开始到结束的秒数。如果事件结束在 selected 时间范围之后(例如),那么它将计算从事件确切开始到 selected 结束日期午夜的秒数。

请注意,因为我使用了日期 table,所以您无法选择部分日期作为日期范围。您可以将其扩展为包括一个时间 table 但它会变得更加复杂(您需要一个单独的开始和结束时间 table 然后在上面考虑该逻辑,已经非常复杂的公式)