Power M Query / Kusto заняли первое место в группе

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

id  timestamp  value1  value2
 1  09:12:37     1       1
 1  09:12:42     1       2
 1  09:12:41     1       3
 1  10:52:16     2       4
 1  10:52:18     2       5
 2  09:33:12     3       1
 2  09:33:15     3       2
 2  09:33:13     3       3

Мне нужно сгруппировать по идентификатору и значению1. Для каждой группы я хочу иметь строку с самой высокой меткой времени.

Результат для таблицы выше будет выглядеть так:

id  timestamp  value1  value2
 1  09:12:42     1       2
 2  09:33:15     3       2

Я знаю, что есть оператор суммирования, который дал бы мне следующее:

mytable
| project id, timestamp, value1, value2
| summarize max(timestamp) by id, value1

Result:
     id  timestamp  value1
      1  09:12:42     1
      2  09:33:15     3

Но мне также не удалось получить значение 2 для этих строк.

заранее спасибо


person ooorndtski    schedule 20.03.2019    source источник


Ответы (2)


Если я правильно понял ваш вопрос, вы сможете использовать summarize arg_max():

doc: https://docs.microsoft.com/en-us/azure/kusto/query/arg-max-aggfunction

datatable(id:long, timestamp:datetime, value1:long, value2:long)
[
 1, datetime(2019-03-20 09:12:37), 1, 1,
 1, datetime(2019-03-20 09:12:42), 1, 2,
 1, datetime(2019-03-20 09:12:41), 1, 3,
 1, datetime(2019-03-20 10:52:16), 2, 4,
 1, datetime(2019-03-20 10:52:18), 2, 5, // this has the latest timestamp for id == 1
 2, datetime(2019-03-20 09:33:12), 3, 1,
 2, datetime(2019-03-20 09:33:15), 3, 2, // this has the latest timestamp for id == 2
 2, datetime(2019-03-20 09:33:13), 3, 3,
]
| summarize arg_max(timestamp, *) by id

Это приведет к:

| id | timestamp                   | value1 | value2 |
|----|-----------------------------|--------|--------|
| 2  | 2019-03-20 09:33:15.0000000 | 3      | 2      |
| 1  | 2019-03-20 10:52:18.0000000 | 2      | 5      |
person Yoni    schedule 20.03.2019
comment
Спасибо за это. Я уже заметил функцию arg_max (), но не знал о *. Принял ваше решение как решение, так как оно выглядит как наиболее правильный способ решения подобных задач. Хотя результаты вашего и моего решения совпадают ;-) - person ooorndtski; 21.03.2019
comment
@Yoni Ты слишком хорош. Уважение ++ - person Pranay Deep; 22.04.2021

Я нашел решение своей проблемы, но может быть и получше.

mytable
| project id, timestamp, value1, value2
| order by timestamp desc
| summarize max(timestamp), makelist(value2) by id, value1

Результаты в:

 id  timestamp  value1  list_value2
  1  09:12:42     1     ["2", "3", "1"]
  2  09:33:15     3     ["2", "3", "1"]

Теперь вы можете расширить запрос, добавив

| project max_timestamp, id, value1, list_value2[0]

чтобы получить первый элемент из этого списка. Замените «0» любым числом от 0 до length (list_value2) -1, чтобы получить доступ к другим значениям.

Еще один совет: я использую метку времени, созданную ApplicationInsights. В нашем коде мы вызываем TrackTrace для регистрации некоторых данных. Если вы упорядочиваете строки по этой временной метке, не гарантируется, что результирующий список строк будет в том же порядке, в котором данные были созданы в коде.

person ooorndtski    schedule 20.03.2019
comment
Чувак, ты изменил постановку задачи. - person Pranay Deep; 22.04.2021