2016-03-11 2 views
0

У меня есть следующие таблицы из соединения 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 

UPDATE:

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

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 
--------- 
+1

мой ответ обновлен для вашего второго вопроса – terrylynch

ответ

4

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

q)sum2:sum 

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

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 

UPDATE:

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

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

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

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

Добавление нечто большее, чем показывает пустой (NULL)

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

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

q)select sum `long$col1 from ([]col1:2147483645 1 1 1i) 
col1 
---------- 
2147483648 
+0

плотина, вы просто избили меня :) –

+0

Ха, извините lol. Кроме того, я думаю, что скопления, которые он распознает, хранятся в .Q.a0 и/или .Q.a1 – terrylynch

+0

Большое спасибо, это имеет смысл. По какой-то странной причине я получаю пустые результаты. См. Выше. Я обновил вопрос. – Istvan

0

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

deviation t`some_id 

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

select enlist deviation some_id from t 
Смежные вопросы