KDB: оптимизация функций - PullRequest
1 голос
/ 16 января 2020

У меня есть 2 таблицы в килобайтах, как показано ниже

q)table1:([]A:1 2 3 5 5 6 2 1;B:`HAK`ZAK`NAK`AAK`AZK`HAK`ZAK`HAK;C:2000.01.01+0 1 2 3 4 0 1 0)
q)table1
A B   C
----------------
1 HAK 2000.01.01
2 ZAK 2000.01.02
3 NAK 2000.01.03
5 AAK 2000.01.04
5 AZK 2000.01.05
6 HAK 2000.01.01
2 ZAK 2000.01.02
1 HAK 2000.01.01
q)table2:([]B:`HAK`ZAK`NAK`AAK`AZK;Z:`NAFK`RFK`NAFK`RFK`ORQ)
q)table2
B   Z
--------
HAK NAFK
ZAK RFK
NAK NAFK
AAK RFK
AZK ORQ

Я хочу изменить столбец B таблицы1 согласно отображению в таблице 2. Например, где бы в столбце B таблицы1 было слово "HAK", посмотрите в столбец table2 таблицыB и замените table1 соответствующим table2 columnz То же самое для всех строк для table1.

окончательный вывод, который я хочу, это table1, должен быть обновлен, как показано ниже.

A B    C
-----------------
1 NAFK 2000.01.01
2 RFK  2000.01.02
3 NAFK 2000.01.03
5 RFK  2000.01.04
5 ORQ  2000.01.05
6 NAFK 2000.01.01
2 RFK  2000.01.02
1 NAFK 2000.01.01

Функция, с которой я пришел, ниже .

hfun:
{$[
x in `$("HAK");`$("NAFK");
x in `$("ZAK");`$("RFK");
x in `$("NAK");`$("NAFK");
x in `$("AAK");`$("RFK");
x in `$(AZK);`$("ORQ");
x]}


finalOutput:update B:hfun'[B] from table1

Вышеуказанная функция работает, как и ожидалось, но невозможно каждый раз писать новую функцию для новых отображений или если в table2 200 строк.

Может кто-нибудь взглянуть а посоветуете дальше?

Ответы [ 4 ]

4 голосов
/ 16 января 2020

Можно также использовать поправку для достижения этого:

@[table1;`B;(!/)table2`B`Z]
3 голосов
/ 16 января 2020
update B:({x[;0]!x[;1]}flip value flip table2)'[B]from table1

Это позволит достичь желаемого результата без необходимости определения дополнительных переменных или условных выражений. Он также работает с пробелами в символах.

2 голосов
/ 16 января 2020

Вы можете использовать обновление словаря вместо условия l oop w /:

dict:`HAK`ZAK`NAK`AAK`AZK!`NAFK`RFK`NAFK`RFK`ORQ;
update B^dict B from table1

(with spaces)
table1:([]A:1 2 3 5 5 6 2 1;B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK";`$"HAK";`$"ZAK";`$"HAK");C:2000.01.01+0 1 2 3 4 0 1 0)
table2:([]B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK");Z:`NAFK`RFK`NAFK`RFK`ORQ)

dict:exec B!Z from table2;
update B^dict B from table1
0 голосов
/ 17 января 2020

Вы также можете использовать ЖЖ

q)select A,B:B^Z,C from table1 lj `B xkey table2
A B    C
-----------------
1 NAFK 2000.01.01
2 RFK  2000.01.02
3 NAFK 2000.01.03
5 RFK  2000.01.04
5 ORQ  2000.01.05
6 NAFK 2000.01.01
2 RFK  2000.01.02
1 NAFK 2000.01.01
...