2

我有一个看起来像这样的表:

在此处输入图像描述

忍受我这会有点混乱;

我想获取所需列中的值。计算为: StartTime-(previous row)Endtime。所以第 2 行(开始时间)减去第 1 行结束时间将是 17:04:48 减去 17:04:31(=17 秒)。但是,我想在进行日期减去计算之前排除CustAgentFl = 0 AND Transferflag = 0的行。此外,如果 Starttime-Endtime <0,则仅为 0。

这些行都按相同的 NID 分组,因此 DAX 查询当然需要按 NID 分组。

4

1 回答 1

3

如果您可以使用数据库为您计算这些值,则可以使用LAG窗口函数从前一行获取值。但是,在数据库中没有明显的前一行,因为行的顺序是未定义的。所以要获取上一行的值,必须定义顺序。这就是OVER子句中 ORDER BY 的目的。我假设您的订单是按 StartTime 的。在这种情况下,您可以使用如下代码:

declare @Table table(NID int, DgAcs char(1), CustAgentFl int, AgentId int, StartTime datetime, EndTime datetime, TransferFlag int, Desired int)

insert into @Table values
    (4565,  'C', 1, 358746, '2018-09-08 17:02:37', '2018-09-08 17:04:31', 1, 0), 
    (4565,  'C', 1, 358714, '2018-09-08 17:04:48', '2018-09-08 17:08:17', 1, 17), 
    (4565,  'C', 1, 359548, '2018-09-08 17:07:07', '2018-09-08 17:13:41', 1, 0), 
    (4565,  'C', 1, 358749, '2018-09-08 17:13:54', '2018-09-08 17:21:09', 1, 13), 
    (4565,  'A', 1, 351897, '2018-09-08 17:19:09', '2018-09-08 17:20:36', 0, 0), 
    (4565,  'C', 1, 358896, '2018-09-08 17:21:08', '2018-09-08 17:26:00', 0, 0)


; with cte as (
select
    *
    , LAG(EndTime, 1) over(order by StartTime) as PrevEndTime
    , DATEDIFF(s, LAG(EndTime, 1) over(order by StartTime), StartTime) as SecondsSinceLastEndNullable
    , ISNULL(DATEDIFF(s, LAG(EndTime, 1) over(order by StartTime), StartTime), 0) as SecondsSinceLastEnd
from @Table 
)

select
    *
    , iif(SecondsSinceLastEnd <= 0, '00:00:00', concat(SecondsSinceLastEnd / 3600, ':', FORMAT((SecondsSinceLastEnd / 60) % 60, 'D2'), ':', FORMAT(SecondsSinceLastEnd % 60, 'D2')))
    , iif(SecondsSinceLastEnd <= 0, '00:00:00', CONVERT(varchar, DATEADD(s, SecondsSinceLastEnd, 0), 108))
from cte

您将所需的输出格式化为时间,但请注意两个时刻之间的差异并不完全是时间。可能超过 24 小时。我向您展示了两种将秒数差异转换为所需格式的方法。第二个使用 CONVERT 来获取 TIME 值,但正如我所说,这不适用于超过 24 小时的间隙。第一种方法将以 H:MM:SS 格式为您提供持续时间,其中 H 是小时数,可能大于 23。

在 Power BI 中,您可以将其编写为自定义查询

于 2018-11-05T08:33:15.420 回答