Приоритетная сортировка по столбцу Запрос Kusto

Сценарий: игроки могут быть отмечены статусом «победитель», «ничья» или «проигравший». Приоритеты статуса таковы: если у игрока когда-либо была ничья, он не может быть проигравшим, если он когда-либо выигрывал, он не мог быть проигравшим или иметь ничью. В таблице 1 записаны строки ошибок, но в нужной таблице должны отображаться игроки, их актуальный статус и временные метки самых последних правильных записей. Это то, что можно сделать с Кусто? Я могу выбрать самые последние по отметке времени с помощью запроса ниже. Я не знаю, как сравнивать. Я начал смотреть на функцию prev (), но не уверен, что она будет делать то, что я хочу, с точки зрения сравнения на основе приоритета. (https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/prevfunction)

          let T1 = datatable(player:string, status:string, timestamp:datetime)
        [
            "A", "winner", datetime(2020-11-24 08:00),
            "A", "winner", datetime(2020-11-24 10:00),
            "B", "tied", datetime(2020-11-24 09:00),
            "B", "tied", datetime(2020-11-24 11:00),
            "B", "tied", datetime(2020-11-24 14:00),
            "B", "loser", datetime(2020-11-24 15:00),
            "C", "loser", datetime(2020-11-24 08:00),
            "C", "loser", datetime(2020-11-24 10:00),
            "C", "loser", datetime(2020-11-24 11:00),
            "C", "loser", datetime(2020-11-24 13:00),
            "C", "tied", datetime(2020-11-24 14:00),
            "C", "winner", datetime(2020-11-24 15:00),
            "D", "winner", datetime(2020-11-24 07:00),
            "D", "winner", datetime(2020-11-24 11:00),
            "D", "winner", datetime(2020-11-24 16:00),
            "D", "tied", datetime(2020-11-24 21:00),
            "E", "tied", datetime(2020-11-24 09:00),
            "E", "tied", datetime(2020-11-24 11:00),
            "E", "loser", datetime(2020-11-24 13:00),
            "E", "tied", datetime(2020-11-24 18:00),
            "F", "loser", datetime(2020-11-24 10:00),
            "F", "loser", datetime(2020-11-24 11:00),
            "F", "loser", datetime(2020-11-24 18:00),
            "G", "loser", datetime(2020-11-24 11:00),
            "G", "tied", datetime(2020-11-24 14:00),
            "G", "loser", datetime(2020-11-24 16:00),
            "G", "tied", datetime(2020-11-24 18:00),
            "G", "loser", datetime(2020-11-24 21:00),
        ]
        ;
        T1
        | summarize arg_max(timestamp, *) by player
        | order by player asc
            
    result:
    player| timestamp                   | status
    _____________________________________________
    A     | 2020-11-24 10:00:00.0000000 | winner
    B     | 2020-11-24 15:00:00.0000000 | loser 
    C     | 2020-11-24 15:00:00.0000000 | winner
    D     | 2020-11-24 21:00:00.0000000 | tied
    E     | 2020-11-24 18:00:00.0000000 | tied
    F     | 2020-11-24 18:00:00.0000000 | loser
    G     | 2020-11-24 21:00:00.0000000 | loser
    H     | 2020-11-24 21:00:00.0000000 | loser

final desired result table:
    player| timestamp                   | status
    _____________________________________________
    A     | 2020-11-24 10:00:00.0000000 | winner
    B     | 2020-11-24 14:00:00.0000000 | tied 
    C     | 2020-11-24 15:00:00.0000000 | winner
    D     | 2020-11-24 16:00:00.0000000 | winner
    E     | 2020-11-24 18:00:00.0000000 | tied
    F     | 2020-11-24 18:00:00.0000000 | loser
    G     | 2020-11-24 18:00:00.0000000 | tied
    H     | 2020-11-24 09:00:00.0000000 | winner

person compscistudent22    schedule 01.12.2020    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, может сработать следующее.

  1. Рассчитайте совокупный статус для каждого игрока в соответствии с предоставленной вами логикой (используя make_set() и array_index_of().

  2. Найдите макс. метка времени для каждого игрока / штата с использованием join

let T = 
    datatable(player: string, status: string, timestamp: datetime)
    [
        "A", "winner", datetime(2020-11-24 08:00),
        "A", "winner", datetime(2020-11-24 10:00),
        "B", "tied", datetime(2020-11-24 09:00),
        "B", "tied", datetime(2020-11-24 11:00),
        "B", "tied", datetime(2020-11-24 14:00),
        "B", "loser", datetime(2020-11-24 15:00),
        "C", "loser", datetime(2020-11-24 08:00),
        "C", "loser", datetime(2020-11-24 10:00),
        "C", "loser", datetime(2020-11-24 11:00),
        "C", "loser", datetime(2020-11-24 13:00),
        "C", "tied", datetime(2020-11-24 14:00),
        "C", "winner", datetime(2020-11-24 15:00),
        "D", "winner", datetime(2020-11-24 07:00),
        "D", "winner", datetime(2020-11-24 11:00),
        "D", "winner", datetime(2020-11-24 16:00),
        "D", "tied", datetime(2020-11-24 21:00),
        "E", "tied", datetime(2020-11-24 09:00),
        "E", "tied", datetime(2020-11-24 11:00),
        "E", "loser", datetime(2020-11-24 13:00),
        "E", "tied", datetime(2020-11-24 18:00),
        "F", "loser", datetime(2020-11-24 10:00),
        "F", "loser", datetime(2020-11-24 11:00),
        "F", "loser", datetime(2020-11-24 18:00),
        "G", "loser", datetime(2020-11-24 11:00),
        "G", "tied", datetime(2020-11-24 14:00),
        "G", "loser", datetime(2020-11-24 16:00),
        "G", "tied", datetime(2020-11-24 18:00),
        "G", "loser", datetime(2020-11-24 21:00),
    ]
;
T
| summarize make_set(status) by player
| project player, status = case(array_index_of(set_status, "winner") > -1, "winner",
                                array_index_of(set_status, "tied") > -1, "tied",
                                "loser")
| join (
    T
    | summarize timestamp = max(timestamp) by player, status
) on player, status
| project player, timestamp, status
person Yoni    schedule 01.12.2020