You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
)

公式说明

  1. 分组排序:通过ADDCOLUMNS和ROW_NUMBER()为每个USER_ID+DATE分组下的条目按TIME升序生成行号,确保能定位到每个条目的紧邻前序条目。
  2. 定位前序时间:根据当前条目的行号,找到行号减1的前一个条目的时间戳。
  3. 结果判断:如果没有前序条目,或前序条目时间与当前时间相同,返回0;否则计算时间差并转换为保留两位小数的小时数。

注意事项

如果表中存在同一USER_ID+DATE+TIME下的多条重复记录,且需要严格按条目顺序(而非时间)计算前序,建议为表添加唯一标识列(如自增ID),并在ORDER BY中加入该列,确保排序的唯一性:

"RowNumber", ROW_NUMBER() OVER (ORDER BY PROD[TIME] ASC, PROD[UniqueID] ASC)

内容的提问来源于stack exchange,提问作者joseph crujeiras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:28:12