как передать массив в запрос на обновление kdb - PullRequest
0 голосов
/ 09 сентября 2018

Здравствуйте, у меня есть следующий код, который я хотел бы найти оптимальный способ передачи массива любого размера без необходимости явно делать это построчно:

два массива - это коэффициенты и тикеры. спасибо

t:update Value:Value*coeffs[0] from (select from t)where Code in `$tickers[0];
t:update Value:Value*coeffs[1] from (select from t)where Code in `$tickers[1];
t:update Value:Value*coeffs[2] from (select from t)where Code in `$tickers[2];
t:update Value:Value*coeffs[3] from (select from t)where Code in `$tickers[3];
t:update Value:Value*coeffs[4] from (select from t)where Code in `$tickers[4];

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Еще один способ сделать это - использовать lj.

q)t:([] n:til 10; Value:1+til 10; Code:10#`a`b`c`d`e)
q)tickers:enlist each "abcdf"

Создание keyed таблицы kt с использованием tickers и coeffs:

q)kt:([Code:`$tickers] coeffs:2 4 6 8 10 )
q)kt
Code| coeffs
----| ------
a   | 2
b   | 4
c   | 6
d   | 8
f   | 10

Теперь присоединяется к t с kt

q)t:t lj kt
q)t
n Value Code coeffs
-------------------
0 1     a    2
1 2     b    4
2 3     c    6
3 4     d    8
4 5     e
5 6     a    2
6 7     b    4
7 8     c    6
8 9     d    8
9 10    e

Обновление таблицы t, где у нас есть non-null coeff значения

q)update Value:Value*coeffs from t where not null coeffs
n Value Code coeffs
-------------------
0 2     a    2
1 8     b    4
2 18    c    6
3 32    d    8
4 5     e
5 12    a    2
6 28    b    4
7 48    c    6
8 72    d    8
9 10    e
  • С lj у вас будет дополнительный столбец coeffs, который вы, возможно, захотите удалить.
  • Это особенно полезно, когда у вас есть несколько сопоставлений (tickers->coeffs, tickers->delta и т. Д.), Вам просто нужно создать одну таблицу со всеми сопоставлениями.
0 голосов
/ 09 сентября 2018

Если предположить, что оба массива имеют одинаковую длину, вы можете попробовать создать словарь от tickers до coeffs:

dict:(`$tickers)!coeffs

Это может быть использовано в выражении update:

update Value:Value*1^dict[Code] from t

Здесь 1^ имеет решающее значение, так как индексирование в dict с несуществующим ключом вернет ноль. Эта запись позволяет вам заполнить нулевые значения 1, таким образом гарантируя, что Value останется прежним.

...