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

У меня есть следующая таблица из соединения JDBC в Q.

q)r
some_int this              created_at                    updated_at          ..
    -----------------------------------------------------------------------------..
1231231    "ASD" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29...
13312    "TSM" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29...

Я хотел бы применить следующую функцию к первому столбцу.

deviation:{a:avg x; sqrt avg (x*x)-a*a}

Это работает для массивов.

q)l
1 2 3 4
q)deviation l
1.118034

Как я могу применить отклонение к столбцу в таблице? Кажется, мой подход не работает:

q)select deviation(some_id) from r
'rank

ОБНОВИТЬ:

Я не могу объяснить следующее:

q)select avg(some_int) from r
some_int
---------
1005341
q)select min(some_int) from r
some_int
---------
812361
q)select max(some_int) from r
some_int
---------
1184014
q)select sum(some_int) from r
some_int
---------

person Istvan    schedule 11.03.2016    source источник
comment
мой ответ обновлен для вашего второго вопроса   -  person terrylynch    schedule 14.03.2016


Ответы (2)


Вам нужно зачислить результат, если это атом, поскольку столбцы таблицы должны быть списками, а не атомами. Обычно kdb может сделать это за вас, но часто нет, когда вы выполняете свои собственные агрегации. Например, даже если вы определяете функцию sum2 как точную копию sum:

q)sum2:sum

kdb может распознавать только сумму как агрегацию и будет зачисляться автоматически, но не для суммы2.

q)select sum col1 from ([]col1:1 2 3 4)
col1
----
10

q)select sum2 col1 from ([]col1:1 2 3 4)
'rank

Итак, вам нужно зачислить во втором случае:

q)select enlist sum2 col1 from ([]col1:1 2 3 4)
col1
----
10

ОБНОВИТЬ:

Чтобы ответить на ваш второй вопрос, похоже, что ваша сумма чисел вышла за границу целого числа. Вам нужно будет преобразовать их в длинные, а затем суммировать

q)select sum col1 from ([]col1:2147483645 1i)
col1
----------
2147483646

Выше указано максимальное целое число. Добавление еще одного дает бесконечность для int

q)select sum col1 from ([]col1:2147483645 1 1i)
col1
----
0W

Добавление чего-либо большего, чем это, показывает пробел (ноль)

q)select sum col1 from ([]col1:2147483645 1 1 1i)
col1
----

Решение состоит в том, чтобы использовать длинные перед суммированием (или сделать их длинными в первую очередь)

q)select sum `long$col1 from ([]col1:2147483645 1 1 1i)
col1
----------
2147483648
person terrylynch    schedule 11.03.2016
comment
Блин, ты меня просто опередил :) - person Manish Patel; 11.03.2016
comment
Ха, извини, лол. Кроме того, я думаю, что агрегации, которые он распознает, хранятся в .Q.a0 и/или .Q.a1. - person terrylynch; 11.03.2016
comment
Большое спасибо, это имеет смысл. По какой-то странной причине я получаю пустые результаты. См. выше, я обновил вопрос. - person Istvan; 12.03.2016

Вы получаете ранг, потому что функция не возвращает список. Поскольку функция возвращает одно число, вероятно, вам просто нужен ответ с одним числом? В этом случае вы можете просто индексировать таблицу (или использовать exec), чтобы получить вектор-столбец и применить его:

deviation t`some_id

В противном случае, если вы хотите сохранить таблицу в качестве ответа, если вы зарегистрируете результат:

select enlist deviation some_id from t
person Manish Patel    schedule 11.03.2016