Как рассчитать совокупную сумму столбца на основе условия в Кусто

#azure-data-explorer #kql #kusto-explorer

Вопрос:

Я хочу рассчитать «нет». дней, в течение которых статус установлен на 1. Каждый раз, когда статус равен 0, счетчик должен перезапускаться с 1.

Примечание: Это не обязательно должны быть последовательные дни

Ввод

 UserId | Day        | Status|
A      |2021-09-16  | 1     |
A      |2021-09-17  | 1     |
A      |2021-09-18  | 1     |
A      |2021-09-19  | 1     |
A      |2021-09-20  | 0     |
A      |2021-09-21  | 1     |
B      |2021-09-16  | 1     |
B      |2021-09-17  | 1     |
B      |2021-09-20  | 1     |
B      |2021-09-21  | 0     |
 

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

 UserId | Day        | Status| Cum_Sum |
A      |2021-09-16  | 1     | 1       |
A      |2021-09-17  | 1     | 2       |
A      |2021-09-18  | 1     | 3       |
A      |2021-09-19  | 1     | 4       |
A      |2021-09-20  | 0     | 0       |
A      |2021-09-21  | 1     | 1       |
B      |2021-09-16  | 1     | 1       |
B      |2021-09-17  | 1     | 2       |
B      |2021-09-20  | 1     | 3       |
B      |2021-09-21  | 0     | 0       |
 

Ответ №1:

вы можете использовать row_cumsum() функцию:

 datatable(UserId:string, Day:datetime, Status:int)
[
    "A", datetime(2021-09-16), 1,
    "A", datetime(2021-09-17), 1,
    "A", datetime(2021-09-18), 1,
    "A", datetime(2021-09-19), 1,
    "A", datetime(2021-09-20), 0,
    "A", datetime(2021-09-21), 1,
    "B", datetime(2021-09-16), 1,
    "B", datetime(2021-09-17), 1,
    "B", datetime(2021-09-20), 1,
    "B", datetime(2021-09-21), 0,
]
| order by UserId asc, Day asc
| extend cumulative_sum = row_cumsum(Status, prev(UserId) != UserId or Status == 0)