PowerBI:基于筛选条件计算船舶港口事件同列时间差的度量值
PowerBI 可复用港口挂靠事件时间差度量值方案
需求概述
需创建可复用的DAX度量值,基于唯一Number列(对应单艘船舶的单次港口挂靠),计算任意两个指定事件的首个发生时间差(单位:小时),例如计算"Pilot on board inwards"到"All Fast"的耗时,且能快速适配其他事件组合。
数据前提
确保数据表中FromDate列已设置为日期时间类型,空值会被自动过滤;每个Number分组下,目标事件至少存在一条带有有效时间的记录。
可复用度量值实现
以下DAX代码通过变量参数化事件名称,只需修改事件名称即可复用:
事件时间差(小时) = VAR 起始事件 = "Pilot on board inwards" // 替换为需要计算的起始事件名称 VAR 结束事件 = "All Fast" // 替换为需要计算的结束事件名称 VAR 当前挂靠编号 = SELECTEDVALUE('你的数据表名'[Number]) VAR 起始时间 = CALCULATE( MIN('你的数据表名'[FromDate]), '你的数据表名'[FieldName] = 起始事件, '你的数据表名'[Number] = 当前挂靠编号, NOT(ISBLANK('你的数据表名'[FromDate])) ) VAR 结束时间 = CALCULATE( MIN('你的数据表名'[FromDate]), '你的数据表名'[FieldName] = 结束事件, '你的数据表名'[Number] = 当前挂靠编号, NOT(ISBLANK('你的数据表名'[FromDate])) ) RETURN IF( AND(NOT(ISBLANK(起始时间)), NOT(ISBLANK(结束时间))), DATEDIFF(起始时间, 结束时间, HOUR), BLANK() )
逻辑说明
- 通过
起始事件和结束事件变量定义目标事件,修改这两个值即可切换计算的事件组合 当前挂靠编号获取当前筛选上下文下的港口挂靠唯一编号起始时间/结束时间分别筛选当前挂靠下对应事件的最早有效时间(符合"首个事件"需求)- 最终返回两个时间的小时差,若任一事件无有效时间则返回空值
复用示例
例如要计算"Anchor aweigh"到"First line ashore"的时间差,仅需修改事件变量:
事件时间差(小时) = VAR 起始事件 = "Anchor aweigh" VAR 结束事件 = "First line ashore" VAR 当前挂靠编号 = SELECTEDVALUE('你的数据表名'[Number]) VAR 起始时间 = CALCULATE( MIN('你的数据表名'[FromDate]), '你的数据表名'[FieldName] = 起始事件, '你的数据表名'[Number] = 当前挂靠编号, NOT(ISBLANK('你的数据表名'[FromDate])) ) VAR 结束时间 = CALCULATE( MIN('你的数据表名'[FromDate]), '你的数据表名'[FieldName] = 结束事件, '你的数据表名'[Number] = 当前挂靠编号, NOT(ISBLANK('你的数据表名'[FromDate])) ) RETURN IF( AND(NOT(ISBLANK(起始时间)), NOT(ISBLANK(结束时间))), DATEDIFF(起始时间, 结束时间, HOUR), BLANK() )
注意事项
- 若
FromDate列未识别为日期时间格式,需先在PowerBI数据转换中调整类型,否则DATEDIFF无法正常计算 - 同一事件在同一挂靠下有多条记录时,
MIN函数会自动取最早发生的时间,符合业务逻辑 - 空的
FromDate记录会被过滤,避免无效计算结果
内容的提问来源于stack exchange,提问作者MMilo
相关产品推荐
相关产品推荐

