如何在 POWER BI 中减去不同行上的日期
How to subtract dates on different rows in POWER BI
我有一个 table 看起来像这样:
请耐心等待,这会有点混乱;
我想获取所需列中的值。计算是:
开始时间-(前一行)结束时间。因此第 2 行(开始时间)减去第 1 行结束时间将为 17:04:48 减去 17:04:31(=17 秒)。但是我想在进行日期减法计算之前 exclude 行 CustAgentFl = 0 AND Transferflag = 0 。此外,如果 Starttime- Endtime 小于 0,则仅为 0。
所有行都按相同的 NID 分组,因此 DAX 查询当然需要按 NID 分组。
如果您可以使用数据库为您计算这些值,则可以使用LAG windowing function to get value from the previous row. However, in databases there is no obvious previous row, because the ordering of rows is undefined. So to get the value of the previous row, you must define the order. This is the purpose of the ORDER BY in the OVER 子句。我假设您的订单是在 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 中,您可以将其写为 custom query。
我有一个 table 看起来像这样:
请耐心等待,这会有点混乱;
我想获取所需列中的值。计算是: 开始时间-(前一行)结束时间。因此第 2 行(开始时间)减去第 1 行结束时间将为 17:04:48 减去 17:04:31(=17 秒)。但是我想在进行日期减法计算之前 exclude 行 CustAgentFl = 0 AND Transferflag = 0 。此外,如果 Starttime- Endtime 小于 0,则仅为 0。
所有行都按相同的 NID 分组,因此 DAX 查询当然需要按 NID 分组。
如果您可以使用数据库为您计算这些值,则可以使用LAG windowing function to get value from the previous row. However, in databases there is no obvious previous row, because the ordering of rows is undefined. So to get the value of the previous row, you must define the order. This is the purpose of the ORDER BY in the OVER 子句。我假设您的订单是在 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 中,您可以将其写为 custom query。