DAX计算列问题:同时间戳条目未正确返回0耗时
解决DAX计算列中同时间戳条目耗时计算问题
问题描述
我有包含USER_ID、DATE、TIME三列的表,需要创建DAX计算列实现以下需求:
- 查找表中相同
USER_ID、DATE且时间更早的紧邻条目 - 计算这些条目的时间差(转换为保留两位小数的浮点小时数)
- 若没有更早条目,或当前条目与前一个紧邻条目时间戳相同,则耗时设为0
当前使用的DAX公式能正常运行,但存在同时间戳条目时,会抓取所有更早条目中最晚的时间戳计算差值,而非将同时间戳条目的耗时设为0,不符合预期。
修改后的DAX公式
Elapsed Time (Hours-Column) = VAR CurrentUser = PROD[USER_ID] VAR CurrentDate = PROD[DATE] VAR CurrentTime = PROD[TIME] -- 为当前用户+日期分组下的条目按时间排序,生成行号 VAR SortedTransactions = ADDCOLUMNS( FILTER(PROD, PROD[USER_ID] = CurrentUser && PROD[DATE] = CurrentDate), "RowNumber", ROW_NUMBER() OVER (ORDER BY PROD[TIME] ASC) ) -- 获取当前条目的行号 VAR CurrentRowNum = MAXX( FILTER(SortedTransactions, PROD[TIME] = CurrentTime), [RowNumber] ) -- 获取前一个紧邻条目的时间 VAR PreviousTransactionTime = MAXX( FILTER(SortedTransactions, [RowNumber] = CurrentRowNum - 1), PROD[TIME] ) -- 计算耗时并返回结果 RETURN IF( ISBLANK(PreviousTransactionTime) || CurrentTime = PreviousTransactionTime, 0, ROUND(DATEDIFF(PreviousTransactionTime, CurrentTime, SECOND) / 3600, 2) )
公式说明
- 分组排序:通过
ADDCOLUMNS和ROW_NUMBER()为每个USER_ID+DATE分组下的条目按TIME升序生成行号,确保能定位到每个条目的紧邻前序条目。 - 定位前序时间:根据当前条目的行号,找到行号减1的前一个条目的时间戳。
- 结果判断:如果没有前序条目,或前序条目时间与当前时间相同,返回0;否则计算时间差并转换为保留两位小数的小时数。
注意事项
如果表中存在同一USER_ID+DATE+TIME下的多条重复记录,且需要严格按条目顺序(而非时间)计算前序,建议为表添加唯一标识列(如自增ID),并在ORDER BY中加入该列,确保排序的唯一性:
"RowNumber", ROW_NUMBER() OVER (ORDER BY PROD[TIME] ASC, PROD[UniqueID] ASC)
内容的提问来源于stack exchange,提问作者joseph crujeiras
相关产品推荐
相关产品推荐

