如何计算对象服务的唯一总天数?解决重复条目与日期重叠问题
计算对象服务状态的唯一作业天数解决方案
核心思路
要解决重复日期或重叠日期范围导致的天数多算问题,关键是将所有作业日期范围展开为单日记录,再对日期去重后统计数量,而非直接求和DaysOnJob列。以下是基于DAX的实现方案(适用于Power BI/Excel Power Pivot):
步骤1:创建基础日期表(如无)
如果数据模型中没有独立的日期表,先创建一个覆盖所有作业日期范围的日期表:
日期表 = CALENDAR(DATE(2020,1,1), DATE(2025,12,31))
可将该表与作业表通过日期字段建立关系(若用度量值实现,也可直接关联)。
步骤2:编写唯一作业天数度量值
单个ObjectCode的月度唯一天数
月度唯一作业天数 = VAR 选中月份 = SELECTEDVALUE('日期表'[月份]) VAR 当前对象 = SELECTEDVALUE('作业表'[ObjectCode]) -- 展开当前对象当月所有作业日期范围的单日记录 VAR 所有作业日期 = GENERATE( FILTER('作业表', '作业表'[ObjectCode] = 当前对象 && MONTH('作业表'[开始日期]) = 选中月份), DATESBETWEEN('日期表'[日期], '作业表'[开始日期], '作业表'[结束日期]) ) -- 对日期去重后统计数量 VAR 唯一日期 = DISTINCT(所有作业日期[日期]) RETURN COUNTROWS(唯一日期)
筛选范围内所有对象的总唯一天数
若需统计多个对象在选中月份的总唯一作业天数(不区分对象,仅统计所有服务过的天数),可调整度量值:
总唯一作业天数 = VAR 选中月份 = SELECTEDVALUE('日期表'[月份]) -- 展开所有筛选对象的作业日期范围 VAR 所有作业日期 = GENERATE( FILTER('作业表', MONTH('作业表'[开始日期]) = 选中月份), DATESBETWEEN('日期表'[日期], '作业表'[开始日期], '作业表'[结束日期]) ) VAR 唯一日期 = DISTINCT(所有作业日期[日期]) RETURN COUNTROWS(唯一日期)
方案说明
GENERATE函数会将每条作业记录的日期范围拆分成单个日期,彻底解决重叠日期或重复日期的统计问题;DISTINCT确保同一天即使被多条记录覆盖,也仅统计一次;- 若通过切片器或报表级筛选指定月份,
SELECTEDVALUE会自动获取当前选中的月份,无需手动配置。
内容的提问来源于stack exchange,提问作者Matt Martin
相关产品推荐
相关产品推荐

