Как вычесть даты в разных строках в POWER BI - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть таблица, которая выглядит так:

enter image description here

Потерпи меня, это немного запутает;

Я хочу получить значения в нужном столбце. Расчет таков: StartTime- (предыдущая строка) Конечное время . Итак, строка 2 (время начала) минус строка 1 Конец времени будет 17:04:48 минус 17:04:31 (= 17сек). Однако я хочу исключить строк, в которых CustAgentFl = 0 AND Transferflag = 0 , прежде чем выполнять вычисление вычитания даты. Кроме того, если Starttime-Endtime <0, тогда просто 0. </p>

Все строки сгруппированы по одному и тому же NID, поэтому, конечно, DAX-запрос должен будет группироваться по NID.

1 Ответ

0 голосов
/ 05 ноября 2018

Если вы можете использовать базу данных для расчета этих значений, вы можете использовать оконную функцию LAG , чтобы получить значение из предыдущей строки. Однако в базах данных нет очевидной предыдущей строки, потому что порядок строк не определен. Таким образом, чтобы получить значение предыдущего ряда, вы должны определить порядок. Это цель ORDER BY в предложении 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, чтобы получить значение ВРЕМЕНИ, но, как я уже сказал, это не будет работать для промежутков, превышающих 24 часа. Первый способ даст вам продолжительность в формате H: MM: SS, где H - количество часов, которое может быть больше 23.

В Power BI вы можете написать это как пользовательский запрос .

...