【问题标题】:How can I calculate a rolling average in DAX/PowerBI?如何计算 DAX/PowerBI 中的滚动平均值?
【发布时间】:2017-04-17 16:27:57
【问题描述】:

在查看 StackOverflow 和 PowerBI 论坛上的几篇帖子后,我仍然无法弄清楚如何根据给定时间段计算滚动平均值——在我的例子中,是 30 天滚动平均。

我看到的大多数帖子都提倡与此相同或非常相似的内容:

Rolling Sum :=
CALCULATE (
    [Sales],
    FILTER (
        ALL ( Sales ),
        [Date]
            >= MAX ( Sales[Date] ) - 365
            && [Date] <= MAX ( Sales[Date] )
    )
)

(代码取自this post

...然而,我似乎无法获得正确的值。

就我而言,我有以下几点:

  1. 给定贷款的“截止日期”(列)
  2. 贷款数量(衡量)
  3. 关闭长度(列)- 关闭贷款的时间长度(以天为单位)

我想计算的是任何一天的滚动 30 天平均值。我编写了以下代码:

Rolling Average = 
    CALCULATE (
        SUM(Query1[Closing_Length])/[Loan Count],                                 
        FILTER (
            ALL ( Query1 ),                             
            [Closing Date].[Date]                                  
                >= MAX ( Query1[Closing Date] ) - 30
                && [Closing Date] <= MAX (  Query1[Closing Date] )
        )
    )

为了检查结果,我使用了一个可视化过滤器来检查一个月的数据,结果如下:

注意底部的总计行;在此特定期间,有 102 笔贷款,总共需要 3922 天才能完成。我想计算的平均值是 3922/102,应该等于大约 38.45 天。相反,我们看到的是 42。

我该如何解决这个问题?

【问题讨论】:

  • @KrystianSakowski 不,该帖子不适用于滚动的 30 天期限。它利用了SAMEPERIODLASTYEAR 函数,并且在 30 天的滚动周期内,您不能整天使用“同一周期”的任何函数而不会出错。
  • 您能发布此成员 Query1[CTC Days] 的表达式或数据吗?
  • @KrystianSakowski 抱歉,它应该是“Closing_Length” - 现在已修复。谢谢!

标签: powerbi dax


【解决方案1】:

基于测量的解决方案:

Rolling Average Measure =
VAR A =
    SUMX (
        FILTER (
            ALL ( 'Query' ),
            'Query'[Closing Date] <= MAX ( 'Query'[Closing Date] )
        ),
        ROUND ( 'Query'[Closing Length], 2 )
    )
VAR B =
    SUMX (
        FILTER (
            ALL ( 'Query' ),
            'Query'[Closing Date] <= MAX ( 'Query'[Closing Date] )
        ),
        ROUND ( 'Query'[Loan Count], 2 )
    )
RETURN
    A / B

基于计算列的解决方案:

Rolling Average =
VAR CurrentDate = 'Query'[Closing Date]
VAR T =
    FILTER ( 'Query', [Closing Date] <= CurrentDate )
RETURN
    ROUND ( SUMX ( T, 'Query'[Closing Length] ) / SUMX ( T, [Loan Count] ), 2 )

打印屏幕:

【讨论】:

  • 这真的很整洁,Krystian- 谢谢。然而,在尝试实现这两种解决方案之后,我遇到了两个问题——对于基于列的解决方案,我有错误A circular dependency was detected: Query1[Rolling Average]. 对于基于度量的解决方案,我只是内存不足;视觉尝试运行大约 5-10 分钟,然后最终显示一个错误窗口,提示没有足够的内存来产生我要求的内容。关于如何处理这两者的任何建议?
  • 看来你做错了什么。看看我的 .pbix 项目:dropbox.com/s/6godtc8h4vre1c7/tst.pbix?dl=0 此外,请将 PBI 更新到最新版本。如果您需要更多帮助,请告诉我。
  • 我在两个文件之间看到的一个明显区别是Loan Count 是您的一列,而在我的则是一个度量。在我的 ETL 中,我有很多贷款编号,每个贷款编号都有自己的截止日期;因此,Loan Count 实际上是设置为COUNT('Query1'[LoanNumber]) 的度量。我尝试创建另一个表,其中包含唯一日期的Closing Date 列,然后是另一个列,其中包含与相应截止日期相关的所有贷款的计数。我正在与后者作斗争。
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 2023-03-16
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多