KQL, разница во времени между отдельными строками в одной таблице

У меня есть Sessions стол

Sessions
|Timespan|Name |No|
|12:00:00|Start|1 |
|12:01:00|End  |2 |
|12:02:00|Start|3 |
|12:04:00|Start|4 |
|12:04:30|Error|5 |

Мне нужно извлечь из него продолжительность каждого сеанса с использованием KQL (но если бы вы могли предложить мне, как я могу сделать это с каким-либо другим языком запросов, это также было бы очень полезно). Но если следующая строка после start также start, это означает, что сеанс был прерван, и мы должны игнорировать его.

Ожидаемый результат:

|Duration|SessionNo|
|00:01:00|    1    |
|00:00:30|    4    |

person Kuba K    schedule 14.01.2021    source источник
comment
Это похожий, но другой вопрос, на который вы, возможно, захотите взглянуть.   -  person Tomer Shetah    schedule 14.01.2021


Ответы (2)


Вы можете попробовать что-то вроде этого:

Sessions
| order by No asc 
| extend nextName = next(Name), nextTimestamp = next(timestamp)
| where Name == "Start" and nextName != "Start"
| project Duration = nextTimestamp - timestamp, No

При использовании оператора order by вы получаете Сериализованный набор строк, который затем можно использовать с такими операторами, как _ 3_ и prev. В основном вы ищете строки с No == "Start" и next(Name) == "End", вот что я сделал,

Вы можете найти этот запрос работает в Открытая база данных образцов Kusto.

person Tomer Shetah    schedule 14.01.2021
comment
Обратите внимание, что serialize здесь не следует использовать, а вместо него следует использовать order by, поскольку Kusto не гарантирует какой-либо порядок для записей, а в вашем случае порядок важен, если вы должны явно указать Kusto, какой порядок вы хотите. - person Slavik N; 16.01.2021
comment
@SlavikN, теоретически ты прав. С технической точки зрения, когда набор данных настолько мал и находится в том же объеме, я почти уверен, что порядок сохраняется. Но да, когда данные большие и у вас много экстентов, данные не сохраняются, и тогда вы должны использовать order by, который возвращает, кстати, сериализованный результат, как это также показано в документации: docs.microsoft.com/en-us/azure/data -explorer / kusto / query / - person Tomer Shetah; 16.01.2021
comment
Вы не должны делать никаких предположений о количестве экстентов, так как Kusto может разделять / объединять экстенты в фоновом режиме в соответствии с тем, что он считает нужным, и в соответствии с различными политиками. Таким образом, даже когда количество записей невелико (что, кстати, не было заявлено как предположение в опубликованном вопросе), это не обязательно означает, что существует только один экстент. - person Slavik N; 17.01.2021
comment
@SlavikN, хотя я не думаю, что вы можете найти реальный пример изменения порядка строк кода: let Sessions = datatable [ ... ], я обновлю свой ответ для тех, кто собирается найти этот ответ и запустить его на реальных данных, где как я и договаривался раньше там порядок не сохранился. - person Tomer Shetah; 17.01.2021

person    schedule
comment
Протестировал этот, и он тоже хорошо работает. Если у нас есть еще 1 столбец userId и разные пользователи могут запускать независимые сеансы, простое изменение | order by No asc на | order by userId,No asc позволяет получить то, что я хотел, с вашим запросом. Спасибо! - person Kuba K; 15.01.2021