Azure Data Explorer Kusto: группировка с разницей в дате и времени - PullRequest
0 голосов
/ 10 февраля 2020

Есть ли способ найти разность даты и времени по столбцу в Data Explorer Kusto? Я хотел бы узнать общее время, проведенное каждым путешественником в Испании.

Путешественник считается находящимся в стране с момента прибытия в эту страну до момента прибытия в следующий пункт назначения. Вот крайние случаи:

  • Если TripComplete == 'Да' и эта страна является последним посещенным пунктом назначения, разница, поездка продолжается, и затраченное время должно быть разницей между now () и временем входа ,
  • Если TripComplete == 'Нет' и эта страна является последним посещенным пунктом назначения, это считается концом поездки. Скажем, для Испании время, проведенное в Испании, должно быть временем, проведенным в Испании в предыдущих поездках путешественником + время с момента их последнего въезда в этот город Испании (сейчас () - EntryTime).

Здесь это ожидаемый результат.

TravellerId result
1           05:00:00        [Madrid to Barcelona + Barcelona to London]
2           00:00:00        [Trip complete]
3           1.00:00:00      [now() - Malaga EntryTime]
4           05:00:00        [now() - Malaga EntryTime]
5           2:00:00         [Malaga to London]
6           1.16:00:00      [Madrid to Barcelona + (now() - Barcelona EntryTime)]
7           11:00:00        [Madrid to London + Barcelona to Beiging]

Источник:

set query_now = datetime(2020-02-04 5:00:00);
datatable(TravellerId:int, Country:string, City:string, TripComplete:string, EntryTime: datetime)
[
  1, 'China', 'Beiging', 'Yes', datetime(2020-02-02 12:00:00),
  1, 'Spain', 'Madrid', 'Yes',datetime(2020-02-02 13:00:00),
  1, 'Spain', 'Barcelona', 'Yes',datetime(2020-02-02 15:00:00),
  1, 'UK', 'London', 'Yes', datetime(2020-02-02 18:00:00),
  2, 'Spain', 'Malaga', 'Yes', datetime(2020-02-03 5:00:00),
  3, 'Spain', 'Malaga', 'No', datetime(2020-02-03 5:00:00),
  4, 'China', 'Beiging', 'No', datetime(2020-02-03 5:00:00),
  4, 'Spain', 'Malaga', 'No', datetime(2020-02-04 00:00:00),
  5, 'China', 'Beiging', 'No', datetime(2020-02-01 5:00:00),
  5, 'Spain', 'Malaga', 'No', datetime(2020-02-02 5:00:00),
  5, 'UK', 'London', 'No', datetime(2020-02-02 7:00:00),
  6, 'China', 'Beiging', 'No', datetime(2020-02-02 12:00:00),
  6, 'Spain', 'Madrid', 'No',datetime(2020-02-02 13:00:00),
  6, 'Spain', 'Barcelona', 'No',datetime(2020-02-02 14:00:00),
  7, 'Spain', 'Madrid', 'Yes',datetime(2020-02-02 13:00:00),
  7, 'UK', 'London', 'Yes', datetime(2020-02-02 18:00:00),
  7, 'Spain', 'Barcelona', 'Yes',datetime(2020-02-03 15:00:00),  
  7, 'China', 'Beiging', 'Yes', datetime(2020-02-03 21:00:00), 
]
| order by TravellerId asc, TripComplete asc
//Incorrect because next() calculation should be limited to the same traveler. 
//Should be something like - if tripComplete = Yes then nextEntry = next(EntryTime, 1, now()) else, nextEntry = next(EntryTime, 1, EntryTime)
| extend nextEntry = next(EntryTime, 1, now())
| extend diffNext = nextEntry - EntryTime
| where Country == "Spain"
| summarize TimeSpentInSpain = sum(diffNext) by TravellerId

1 Ответ

1 голос
/ 10 февраля 2020

вы можете попробовать что-то вроде следующего:

set query_now = datetime(2020-02-04 5:00:00);
datatable(TravellerId:int, Country:string, City:string, TripComplete:string, EntryTime: datetime)
[
  1, 'China', 'Beiging', 'Yes', datetime(2020-02-02 12:00:00),
  1, 'Spain', 'Madrid', 'Yes',datetime(2020-02-02 13:00:00),
  1, 'Spain', 'Barcelona', 'Yes',datetime(2020-02-02 14:00:00),
  1, 'UK', 'London', 'Yes', datetime(2020-02-02 15:00:00),
  2, 'Spain', 'Malaga', 'No', datetime(2020-02-03 5:00:00),
]
| order by TravellerId asc, EntryTime asc
| extend diff = EntryTime - prev(EntryTime)
| where Country == "Spain"
| summarize result = sumif(diff, TripComplete == "Yes") + sumif(now() - EntryTime, TripComplete != "Yes") by TravellerId
...