Кусто: как преобразовать значение таблицы в скаляр и вернуться из пользовательской функции

У меня есть следующие определяемые пользователем функции с намерением использовать условный регистр для вывода таблицы из нулей или единиц, указывающих, активна ли учетная запись.

case требует скалярных значений в качестве аргументов, т.е. pro_account_active (account) и basic_account_active (account) должны быть скалярными значениями.

Я изо всех сил пытаюсь обойти ограничение toscalar:

Пользовательские функции не могут передавать в вызов toscalar () информацию, которая зависит от контекста строки, в которой вызывается функция.

Я думаю, что если бы была функция, которую я мог бы использовать вместо ?????? который преобразует active в скаляр и вернет его из функции, с которой он будет работать.

Любая помощь очень ценится

let basic_account_active=(account:string) {
    basic_check_1(account) // returns 0 or 1 row only
    | union basic_check_2(account)
    | summarize result_count = count()
    | extend active = iff(result_count == 2, 1, 0)
    | ??????
};
let pro_account_active=(account:string) {
    pro_check_1(account) // returns 0 or 1 row only
    | union pro_check_2(account)
    | summarize result_count = count()
    | extend active = iff(result_count == 2, 1, 0)
    | ??????
};
let is_active=(account_type:string, account:string) {
    case(
        account_type == 'pro', pro_account_active(account),
        account_type == 'basic', basic_account_active(account),
        -1
    )
};
datatable(account_type:string, account:string)
[
 'pro', '89e5678a92',
 'basic', '9d8263da45',
 'pro', '0b975f2454a',
 'basic', '112a3f4753',
]
| extend result = is_active(account_type, account)


person slimjob1217    schedule 26.09.2020    source источник


Ответы (2)


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

let basicAccounts1 = datatable(account_type:string, account:string)[ 'basic', '9d8263da45', 'basic', '111111'];
let basicAccounts2 = datatable(account_type:string, account:string)[ 'basic', '9d8263da45', 'basic', '222222'];
let proAccounts1 = datatable(account_type:string, account:string)[ 'pro', '89e5678a92', 'pro', '111111'];
let proAccounts2 = datatable(account_type:string, account:string)[ 'pro', '89e5678a92', 'pro', '222222'];
let AllAccounts = union basicAccounts1, basicAccounts2, proAccounts1, proAccounts2
| summarize count() by account, account_type;
datatable(account_type:string, account:string)
[
 'pro', '89e5678a92',
 'basic', '9d8263da45',
 'pro', '0b975f2454a',
 'basic', '112a3f4753',
]
| join kind=leftouter hint.strategy=broadcast (AllAccounts) on account, account_type
| extend IsActive = count_ >=2
| project-away count_, account1, account_type1

Результаты:  введите описание изображения здесь

person Avnera    schedule 27.09.2020

Вы можете преобразовать вывод запроса в скаляр с помощью функции toscalar(), т.е.

let basic_account_active=(account:string) {
toscalar(basic_check_1(account) // returns 0 or 1 row only
| union basic_check_2(account)
| summarize result_count = count()
| extend active = iff(result_count == 2, 1, 0))};
person JulesK    schedule 29.01.2021