Можно ли написать пользовательскую функцию, которая проверяет, находится ли переданное значение в результатах второго запроса? - PullRequest
0 голосов
/ 10 июля 2020

Я хочу написать пользовательскую функцию, которая принимает ввод и возвращает, присутствует ли этот ввод в другом запросе. В основном это

.create-or-alter function with (folder = "foo") IsPresent(userInput: string) {
        toscalar(
            OtherTable
            | where x == userInput
            | summarize count()
        )
    )
}

Итак, я могу сделать что-то подобное в моем базовом запросе

Foo
| extend isPresent = IsPresent(x)

Это приводит к ошибке Semanti c error: '' имеет следующее semanti c error: Неразрешенная привязка ссылки: 'userInput'.

В качестве обходного пути я попытался изменить IsPresent для возврата make_list (x), а затем в моем базовом запросе сделайте это

let vals = IsPresent();
Foo
| extend isPresent = vals contains x

который работает, но невероятно медленно.

Есть ли правильный способ сделать это? Я пытаюсь избежать написания соединения в моем базовом запросе; я хотел бы что-нибудь простое и многоразовое. Я искал, но не могу найти примеров того, как кто-то пытается сделать что-то подобное

1 Ответ

1 голос
/ 10 июля 2020

вы можете попробовать переписать свою функцию, чтобы принимать табличные аргументы, а затем использовать оператор invoke . пример можно найти ниже.


.set T <| range x from 1 to 10 step 1  // a dummy data set

.set Other_T <| range y from 5 to 10000 step 1 // another dummy data set

.create-or-alter function IsPresent (T1:(userInput:long), T2:(y:long)) {
    let values = T2 | project y;
    T1
    | extend is_present = userInput in (values)
}

T
| project-rename userInput = x
| invoke IsPresent(Other_T)

->

| userInput | is_present |
|-----------|------------|
| 1         | 0          |
| 2         | 0          |
| 3         | 0          |
| 4         | 0          |
| 5         | 1          |
| 6         | 1          |
| 7         | 1          |
| 8         | 1          |
| 9         | 1          |
| 10        | 1          |
...