如何在DAX中基于全量日期范围计算报表的平均每日唯一用户?
解决DAX中覆盖全日期范围的平均日活用户计算问题
原代码的问题在于只统计了有报表使用记录的日期,那些没人访问报表的日期被排除在外,导致平均值被拉高。要修正这个问题,需要先构建「过去12个月所有日期 + 所有报表」的全量组合,再计算每个组合的日活(无访问则为0),最后求平均。
修改后的DAX度量值
6.2 average unique daily visitors = VAR Past12MonthsDates = // 获取过去12个月的所有日期(基于日期维度表) DATESINPERIOD( 'Dates Dim_Dates'[TheDate], TODAY(), -12, MONTH ) VAR AllReportCombinations = // 获取所有唯一的报表组合(文件夹+报表名) DISTINCT( SELECTCOLUMNS( 'z_Report_usage Report_runs', "Folder_Name", 'z_Report_usage Report_runs'[Folder_Name], "Report_name", 'z_Report_usage Report_runs'[Report_name] ) ) VAR DateReportCrossJoin = // 生成日期和报表组合的笛卡尔积,确保每个报表每天都有记录 CROSSJOIN(Past12MonthsDates, AllReportCombinations) VAR DailyUserCounts = // 计算每个日期-报表组合的唯一用户数,无访问则返回0 ADDCOLUMNS( DateReportCrossJoin, "User count", VAR CurrentDate = [TheDate] VAR CurrentFolder = [Folder_Name] VAR CurrentReport = [Report_name] RETURN CALCULATE( DISTINCTCOUNT('z_Report_usage Report_runs'[User_crsid]), 'z_Report_usage Report_runs'[Folder_Name] = CurrentFolder, 'z_Report_usage Report_runs'[Report_name] = CurrentReport, 'z_Report_usage Report_runs'[Run_Date] = CurrentDate // 替换为报表使用表的实际日期字段名 ) + 0 // 无结果时返回0 ) RETURN // 计算所有日期-报表组合的用户数平均值 AVERAGEX(DailyUserCounts, [User count])
关键修改说明
- Past12MonthsDates:明确筛选出过去12个月的所有日期,确保不遗漏任何一天。
- AllReportCombinations:提取所有存在的报表组合,避免遗漏报表。如果有专门的报表维度表,建议直接用维度表替代这里的DISTINCT查询,性能更优。
- DateReportCrossJoin:通过笛卡尔积生成「每日+每报表」的全量组合,这是解决问题的核心——确保无访问的日期也被纳入计算。
- DailyUserCounts:对每个组合计算当日用户数,用
+0确保无访问时返回0(DISTINCTCOUNT无结果会返回BLANK,加0转为0)。 - 注意:请将代码中的
'z_Report_usage Report_runs'[Run_Date]替换为报表使用表中记录访问日期的实际字段名。
额外优化建议
如果报表数量很多,笛卡尔积可能会影响性能,此时可以:
- 使用专门的报表维度表(包含所有Folder_Name和Report_name)替代从使用表提取的AllReportCombinations。
- 考虑在日期表中预先标记过去12个月的日期,减少计算量。
内容的提问来源于stack exchange,提问作者SamuelEJ
相关产品推荐
相关产品推荐

