Kdb Q: левое соединение только на нулевых строках - PullRequest
0 голосов
/ 14 января 2019

Я хочу выполнить левое соединение между двумя таблицами t1 и t2 в столбце id2, только если id2 равно нулю на стороне t1.
Как qbie, мне было интересно, если оно существует лучшее решение, чем мое ниже?

t1: ([] id1:`AAA`BBB`CCC`DDD`EEE; id2:```02C``E25)
t2: ([] id1:`AAA`BBB`CCC`DDD`SSS; id2:`02A`02B`C2C`DD0`SPE)

Ожидаемый результат:

([] id1:`AAA`BBB`CCC`DDD`EEE; id2:`02A`02B`02C`DD0`E25)

id1 id2
-------
AAA 02A
BBB 02B
CCC 02C
DDD DD0
EEE E25

Мое решение до сих пор состоит в том, чтобы выполнить левое соединение, изменив столбец id2 на id3 с t2, а затем примените вектор-условную функцию ?:

t1:t1 lj 1!select id1, id3:id2 from t2
t1[`id2]: ?[null t1[`id2];t1[`id3];t1[`id2]]
t1:delete id3 from t1

Спасибо!

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вы можете просто отфильтровать строки из t2 для символов, которые являются нулевыми в t1, и просто выполнить левое соединение в этой новой таблице. Это также полезно, если в вашей таблице много столбцов для объединения.

q) t1 lj 1! select from t2 where id1 in exec id1 from t1 where id2=`
0 голосов
/ 14 января 2019

Другой подход с использованием заливки ^:

q){key[x]#y^x}[1!t1;1!t2]
id1| id2
---| ---
AAA| 02A
BBB| 02B
CCC| 02C
DDD| DD0
EEE| E25
0 голосов
/ 14 января 2019

Одна строка под ключом ставит таблицу t2, затем индексирует в эту таблицу, передавая ей таблицу столбца id1 из t1 и выбирает значение id2. Затем выполните заливку (^), чтобы принять это значение только тогда, когда id2 из t1 равен нулю.

q)t1: ([] id1:`AAA`BBB`CCC`DDD`EEE; id2:```02C``E25)
q)t2: ([] id1:`AAA`BBB`CCC`DDD`SSS; id2:`02A`02B`C2C`DD0`SPE)
q)update (1!t2)[([]id1);`id2]^id2 from t1
id1 id2
-------
AAA 02A
BBB 02B
CCC 02C
DDD DD0
EEE E25
...