使用 DAX 检测条目之间的经过时间

问题描述 投票:0回答:1

我有 3 列 用户 ID、日期和时间 我正在尝试创建一个计算列 A) 在表中查找具有相同用户 ID、日期和更早时间的条目 B)计算这些值之间的差异 C) 如果没有更早的条目,则将经过时间设置为 0 D) 将结果转换为浮点数

Elapsed Time (Hours-Column) = 
VAR CurrentTransactionTime = PROD[TIME]
VAR PreviousTransactionTime =
    CALCULATE(
        MAX(PROD[TIME]),
        FILTER(
            ALL(PROD),
            PROD[USER_ID] = EARLIER(PROD[USER_ID]) &&
            PROD[DATE] = EARLIER(PROD[DATE]) &&
            PROD[TIME] < CurrentTransactionTime
        )
    )
VAR ElapsedTimeInSeconds = DATEDIFF(PreviousTransactionTime, CurrentTransactionTime, SECOND)
VAR ElapsedTimeInHours = DIVIDE(ElapsedTimeInSeconds, 3600, 0)
RETURN
IF(
    ISBLANK(PreviousTransactionTime) || ISBLANK(CurrentTransactionTime),
    0,
    ROUND(ElapsedTimeInHours, 2)
)

我当前的公式有效,但是如果两个事件具有相同的事务时间,则前一个事务时间函数中的过滤器将找到具有前一个时间的记录,并从那里计算 datediff,而不是具有相同时间戳的条目。

我的公式中的过滤器没有按预期运行。它获取较早的时间戳而不是相似的时间戳,并从原始条目复制经过的时间,而不是将经过的时间设置为 0

我想要它做什么

它有什么作用

dax powerbi-desktop
1个回答
0
投票

我可以让它工作的唯一方法是添加一个索引列来区分两个重复的行。因此,我更改了表的排序顺序,并在 Power Query 中添加了索引列。以下是这些步骤:

  1. User_ID
    升序、
    Date
    升序、
    Time
    升序排序。
  2. 添加索引列

代码:

let

    PreviousSteps  = *{Previous steps taken in query}*
    #"Sorted Rows" = Table.Sort(PreviousSteps,{{"USER_ID", Order.Ascending}, {"DATE", Order.Ascending}, {"TIME", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type)
in
    #"Added Index"

一旦我们有了该索引列,我们就可以使用它来按小于当前索引的所有行来过滤表。

更新计算列:

Elapsed Time (Hours-Column) Updated = 

VAR thisUser = [USER_ID]
VAR thisDate = [DATE]
VAR CurrentTransactionTime = [TIME]
VAR thisIndex = [Index]


VAR PreviousTransactionTime =
    CALCULATE(
        MAX(PROD[TIME]),
        FILTER(
            ALL(PROD),
            PROD[USER_ID] = thisUser &&
            PROD[DATE] = thisDate &&
            PROD[Index] < thisIndex
        )
    )   

VAR ElapsedTimeInSeconds = DATEDIFF(PreviousTransactionTime, CurrentTransactionTime, SECOND)
VAR ElapsedTimeInHours = DIVIDE(ElapsedTimeInSeconds, 3600, 0)
RETURN
IF(
    ISBLANK(PreviousTransactionTime) || ISBLANK(CurrentTransactionTime),
    0,
    ROUND(ElapsedTimeInHours, 2)
)

输出:

用户ID 日期 时间 索引 已用时间(小时列) 已用时间(小时列)已更新
2024年5月22日 1:00 0 0 0
2024年5月22日 1:30 1 0.5 0.5
2024年5月22日 1:30 2 0.5 0
2024年5月22日 2:00 3 0.5 0.5
2024/05/23 1:00 4 0 0
瑞克 2024年5月22日 1:00 5 0 0
瑞克 2024年5月22日 1:30 6 0.5 0.5
史蒂夫 2024年5月22日 1:00 7 0 0
史蒂夫 2024年5月22日 1:30 8 0.5 0.5
© www.soinside.com 2019 - 2024. All rights reserved.