2015-03-27 2 views
0

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

d:{[x] :x.hh} 
f:{[x;y] :x+y} 

Теперь я хочу использовать функцию f в запросе следующим образом:

select f each (columnOne,d[columnTwo]) from myTable 

Поэтому я сначала хочу, чтобы преобразовать один столбец в соответствующие номера используя функция d. Затем, используя как columnOne, так и вывод d[columnTwo], я хочу рассчитать результат f.

Понятно, что описанный выше подход не работает, поскольку он не работает с ошибкой 'rank.

Я также пробовал select f ./: (columnOne,'d[columnTwo]) from myTable, который также не работает.

Как это сделать? Обратите внимание, что мне нужно ввести columnOne и columnTwo в f так, чтобы соответствующие строки по-прежнему совпадали. Например. введите строку 1 из columnOne и строку 1 из columnTwo одновременно в f.

ответ

2

Я также пробовал select f ./: (columnOne,'d[columnTwo]) from myTable, который также не работает.

Вы очень близки этому кодексу. Вопрос заключается в d функции, в частности, x.hh в функции d - .hh обозначения не работает в этом контексте, и вам нужно будет сделать `hh$x вместо этого, так d становится:

d:{[x] :`hh$x} 

Так делает только это изменить в коде выше, мы получаем:

q)d:{[x] :`hh$x} 
q)f:{[x;y] :x+y} 
q)myTable:([] columnOne:10?5; columnTwo:10?.z.t); 
q)update res:f ./: (columnOne,'d[columnTwo]) from myTable 
    columnOne columnTwo res 
    -------------------------- 
    1   21:10:45.900 22 
    0   20:23:25.800 20 
    2   19:03:52.074 21 
    4   00:29:38.945 4 
    1   04:30:47.898 5 
    2   04:07:38.923 6 
    0   06:22:45.093 6 
    1   19:06:46.591 20 
    1   10:07:47.382 11 
    2   00:45:40.134 2 

(я изменил select к update так что вы можете увидеть другие столбцы в таблице результатов)

Другого синтаксиса для достижения тех же:

q)update res:f'[columnOne;d columnTwo] from myTable 
    columnOne columnTwo res 
    -------------------------- 
    1   21:10:45.900 22 
    0   20:23:25.800 20 
    2   19:03:52.074 21 
    4   00:29:38.945 4 
    1   04:30:47.898 5 
    2   04:07:38.923 6 
    0   06:22:45.093 6 
    1   19:06:46.591 20 
    1   10:07:47.382 11 
    2   00:45:40.134 2 

Только других ноты, достойного пункта - в приведенном выше примере, функция d является vectorised (работает с вектором аргом), если это не так, вы бы необходимо изменить d[columnTwo] к d each columnTwo (или d'[columnTwo])

затем это приведет к одному из следующих запросов:

select res:f'[columnOne;d'[columnTwo]] from myTable 
select res:f ./: (columnOne,'d each columnTwo) from myTable 
select res:f ./: (columnOne,'d'[columnTwo]) from myTable 
+0

Я попробую это. На самом деле моя настоящая функция 'd' делает что-то еще. Я просто сделал это «.hh» для этого вопроса. Но это кажется очень полезным. Спасибо! –

+0

Теперь, когда я думаю об этом, обе мои функции 'f' и' d', вероятно, не являются * векторами. Следовательно, оба требуют своего рода «каждый» в качестве входных данных. Как будет работать синтаксис? Спасибо заранее :) –

+0

Ничего, я сам нашел синтаксис (я обновил ваш ответ с помощью некоторых примерных запросов). Это было так же, как и вы. Еще раз спасибо :) –

Смежные вопросы