Power BI / DAX — 变化时间段的动态比较
Power BI / DAX — Dynamic comparison for changing time period
首先,让我告诉你我正在处理的数据。它是来自 Google Analytics 的过去 6-8 周的网络数据,所以我有日期、值和很多维度。这是我在 Power Bi 中尝试使用它进行的操作。
我想将特定时期的价值总和与相应时期进行比较。但!正常的平行周期公式不适用于我的情况(或者也许我错了,我可以以某种方式使用它们)因为我在比较中需要以下逻辑:
如果在过滤器中选择小于或等于 7 天而不是与 7 天前的值进行比较(因此如果选择两天与一周前的两天进行比较)
如果选择超过 7 天与前一个相同大小的时间段相比(因此如果选择 13 天与之前的 13 天相比)
另外,我希望此措施能够响应维度方面的过滤。
我需要一个百分比差异,但我目前正在研究至少可以 return 对我来说基于上述逻辑的值。
这是我目前所了解的(下)。我查阅了这个解决方案 ,老实说我只理解了一半。
这里的问题是,当我尝试添加要在此度量中考虑的所有这些维度(解决方案的底部)时,计算变得非常慢并且无法真正使用。
我请求社区帮助我优化此脚本,或者针对我的问题提出不同的解决方案。
非常感谢!
Sessions Past Period =
CALCULATE(SUM (ci_dashboard_v7[Sessions]), FILTER ( ALL ( ci_dashboard_v7 ),
COUNTROWS (FILTER ( ci_dashboard_v7, EARLIER ( ci_dashboard_v7[Date] ) = DATEADD ( ci_dashboard_v7[Date],IF(DISTINCTCOUNT(ci_dashboard_v7[Date])<7,-7,DISTINCTCOUNT(ci_dashboard_v7[Date])), DAY )
&& ci_dashboard_v7[WMC_partner_lvl1]=EARLIER(ci_dashboard_v7[WMC_partner_lvl1])
&& ci_dashboard_v7[WMC_partner_lvl2]=EARLIER(ci_dashboard_v7[WMC_partner_lvl2])
&& ci_dashboard_v7[Campaign]=EARLIER(ci_dashboard_v7[Campaign])
&& ci_dashboard_v7[cd003]=EARLIER(ci_dashboard_v7[cd003])
&& ci_dashboard_v7[cd135]=EARLIER(ci_dashboard_v7[cd135])
&& ci_dashboard_v7[Channel]=EARLIER(ci_dashboard_v7[Channel])
&& ci_dashboard_v7[Channel_simple]=EARLIER(ci_dashboard_v7[Channel_simple])
&& ci_dashboard_v7[Date]=EARLIER(ci_dashboard_v7[Date])
&& ci_dashboard_v7[Country]=EARLIER(ci_dashboard_v7[Country])
&& ci_dashboard_v7[Domain]=EARLIER(ci_dashboard_v7[Domain])
&& ci_dashboard_v7[Week]=EARLIER(ci_dashboard_v7[Week])
&& ci_dashboard_v7[Week_day]=EARLIER(ci_dashboard_v7[Week_day])
&& ci_dashboard_v7[Year_current]=EARLIER(ci_dashboard_v7[Year_current])
&& ci_dashboard_v7[Week_current]=EARLIER(ci_dashboard_v7[Week_current])
&& ci_dashboard_v7[Week_before_current]=EARLIER(ci_dashboard_v7[Week_before_current])
&& ci_dashboard_v7[is_CRM]=EARLIER(ci_dashboard_v7[is_CRM])
&& ci_dashboard_v7[WMC_tm]=EARLIER(ci_dashboard_v7[WMC_tm])
&& ci_dashboard_v7[Platform]=EARLIER(ci_dashboard_v7[Platform])
&& ci_dashboard_v7[Device]=EARLIER(ci_dashboard_v7[Device])
&& ci_dashboard_v7[OS]=EARLIER(ci_dashboard_v7[OS])
&& ci_dashboard_v7[WMC_type]=EARLIER(ci_dashboard_v7[WMC_type])
&& ci_dashboard_v7[Source_Accengage_Pigeon]=EARLIER(ci_dashboard_v7[Source_Accengage_Pigeon])
&& ci_dashboard_v7[WMC_tool]=EARLIER(ci_dashboard_v7[WMC_tool])
&& ci_dashboard_v7[WMC_full]=EARLIER(ci_dashboard_v7[WMC_full])
&& ci_dashboard_v7[Source]=EARLIER(ci_dashboard_v7[Source])
))))
此解决方案假定您在 ci_dashboard_v7[日期] 列中只有日期(没有时间)。
以下是您可以尝试的方法:
- 创建日历 table 并将其命名为 日期。最简单的方法是使用以下公式创建计算的 table:
Date = CALENDARAUTO()
- 在'Date'[Date]和ci_dashboard_v7[Date][=28=之间创建一对多关系]
- 隐藏ci_dashboard_v7[Date]列,只在切片器中使用'Date'[Date]
创建以下度量:
Sessions Past Period =
CALCULATE (
SUM ( ci_dashboard_v7[Sessions] ),
DATEADD ( 'Date'[Date], - MAX ( 7, COUNTROWS ( 'Date' ) ), DAY )
)
首先,让我告诉你我正在处理的数据。它是来自 Google Analytics 的过去 6-8 周的网络数据,所以我有日期、值和很多维度。这是我在 Power Bi 中尝试使用它进行的操作。
我想将特定时期的价值总和与相应时期进行比较。但!正常的平行周期公式不适用于我的情况(或者也许我错了,我可以以某种方式使用它们)因为我在比较中需要以下逻辑: 如果在过滤器中选择小于或等于 7 天而不是与 7 天前的值进行比较(因此如果选择两天与一周前的两天进行比较) 如果选择超过 7 天与前一个相同大小的时间段相比(因此如果选择 13 天与之前的 13 天相比) 另外,我希望此措施能够响应维度方面的过滤。 我需要一个百分比差异,但我目前正在研究至少可以 return 对我来说基于上述逻辑的值。
这是我目前所了解的(下)。我查阅了这个解决方案
这里的问题是,当我尝试添加要在此度量中考虑的所有这些维度(解决方案的底部)时,计算变得非常慢并且无法真正使用。
我请求社区帮助我优化此脚本,或者针对我的问题提出不同的解决方案。
非常感谢!
Sessions Past Period =
CALCULATE(SUM (ci_dashboard_v7[Sessions]), FILTER ( ALL ( ci_dashboard_v7 ),
COUNTROWS (FILTER ( ci_dashboard_v7, EARLIER ( ci_dashboard_v7[Date] ) = DATEADD ( ci_dashboard_v7[Date],IF(DISTINCTCOUNT(ci_dashboard_v7[Date])<7,-7,DISTINCTCOUNT(ci_dashboard_v7[Date])), DAY )
&& ci_dashboard_v7[WMC_partner_lvl1]=EARLIER(ci_dashboard_v7[WMC_partner_lvl1])
&& ci_dashboard_v7[WMC_partner_lvl2]=EARLIER(ci_dashboard_v7[WMC_partner_lvl2])
&& ci_dashboard_v7[Campaign]=EARLIER(ci_dashboard_v7[Campaign])
&& ci_dashboard_v7[cd003]=EARLIER(ci_dashboard_v7[cd003])
&& ci_dashboard_v7[cd135]=EARLIER(ci_dashboard_v7[cd135])
&& ci_dashboard_v7[Channel]=EARLIER(ci_dashboard_v7[Channel])
&& ci_dashboard_v7[Channel_simple]=EARLIER(ci_dashboard_v7[Channel_simple])
&& ci_dashboard_v7[Date]=EARLIER(ci_dashboard_v7[Date])
&& ci_dashboard_v7[Country]=EARLIER(ci_dashboard_v7[Country])
&& ci_dashboard_v7[Domain]=EARLIER(ci_dashboard_v7[Domain])
&& ci_dashboard_v7[Week]=EARLIER(ci_dashboard_v7[Week])
&& ci_dashboard_v7[Week_day]=EARLIER(ci_dashboard_v7[Week_day])
&& ci_dashboard_v7[Year_current]=EARLIER(ci_dashboard_v7[Year_current])
&& ci_dashboard_v7[Week_current]=EARLIER(ci_dashboard_v7[Week_current])
&& ci_dashboard_v7[Week_before_current]=EARLIER(ci_dashboard_v7[Week_before_current])
&& ci_dashboard_v7[is_CRM]=EARLIER(ci_dashboard_v7[is_CRM])
&& ci_dashboard_v7[WMC_tm]=EARLIER(ci_dashboard_v7[WMC_tm])
&& ci_dashboard_v7[Platform]=EARLIER(ci_dashboard_v7[Platform])
&& ci_dashboard_v7[Device]=EARLIER(ci_dashboard_v7[Device])
&& ci_dashboard_v7[OS]=EARLIER(ci_dashboard_v7[OS])
&& ci_dashboard_v7[WMC_type]=EARLIER(ci_dashboard_v7[WMC_type])
&& ci_dashboard_v7[Source_Accengage_Pigeon]=EARLIER(ci_dashboard_v7[Source_Accengage_Pigeon])
&& ci_dashboard_v7[WMC_tool]=EARLIER(ci_dashboard_v7[WMC_tool])
&& ci_dashboard_v7[WMC_full]=EARLIER(ci_dashboard_v7[WMC_full])
&& ci_dashboard_v7[Source]=EARLIER(ci_dashboard_v7[Source])
))))
此解决方案假定您在 ci_dashboard_v7[日期] 列中只有日期(没有时间)。
以下是您可以尝试的方法:
- 创建日历 table 并将其命名为 日期。最简单的方法是使用以下公式创建计算的 table:
Date = CALENDARAUTO()
- 在'Date'[Date]和ci_dashboard_v7[Date][=28=之间创建一对多关系]
- 隐藏ci_dashboard_v7[Date]列,只在切片器中使用'Date'[Date]
创建以下度量:
Sessions Past Period = CALCULATE ( SUM ( ci_dashboard_v7[Sessions] ), DATEADD ( 'Date'[Date], - MAX ( 7, COUNTROWS ( 'Date' ) ), DAY ) )