我有 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
我可以让它工作的唯一方法是添加一个索引列来区分两个重复的行。因此,我更改了表的排序顺序,并在 Power Query 中添加了索引列。以下是这些步骤:
User_ID
升序、Date
升序、Time
升序排序。代码:
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 |