如何在POWER BI

时间:2018-11-04 23:25:31

标签: sql-server datetime powerbi dax date-difference

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

enter image description here

与我一起承担这将使您感到困惑;

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

所有行均按同一NID分组,因此DAX查询当然需要按NID分组。

1 个答案:

答案 0 :(得分:3)

如果可以使用数据库为您计算这些值,则可以使用JSR-310窗口函数从上一行获取值。但是,在数据库中没有明显的前一行,因为行的顺序是不确定的。因此,要获取上一行的值,必须定义顺序。这是datatypes子句中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中,您可以将其写为here