Утилита вроде за исключением таблиц в kdb - PullRequest
0 голосов
/ 11 февраля 2020

Поскольку у нас есть кроме функции для списков в kdb, чтобы найти элементы, которые присутствуют в одном списке, а не в другом, аналогично, есть ли у нас какая-либо утилита для извлечения строк, представленных в одной таблице, а не в другой на основе столбца?

Например: у меня есть две таблицы:

l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)

Так как для столбца c1 в таблице l есть строка c d, которой нет в столбце c1 таблицы r.
У нас есть какая-нибудь утилита в kdb, которую можно использовать для получения вывода, как показано ниже?

c1 c2
-----
c  30
d  40

Я получил вывод, используя -

select from l where c1 in l[`c1] except r`c1

Но я ищу лучше / оптимизированное решение / утилита, чтобы получить тот же результат.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Не думаю, что с вашей текущей реализацией что-то не так, но вы можете использовать drop (он же _) для таблицы с ключами для более краткого подхода:

q)#[1#`c1;r]_1!l
c1| c2
--| --
c | 30
d | 40

Это также остается довольно аккуратно, когда они "ключ" больше, чем один столбец:

l0:([]c0:`x`y`z`w;c1:`a`b`c`d;c2:10 20 30 40)
r0:([]c0:`y`x`x`x`y;c1:`a`a`a`b`b;c3:100 200 300 400 50)

q)#[`c0`c1;r0]_2!l0
c0 c1| c2
-----| --
z  c | 30
w  d | 40
1 голос
/ 11 февраля 2020

Более функциональная форма будет такой:

{cl:cols[x]inter cols y;x where not(cl#x)in cl#y}[l;r]
c1 c2
-----
c  30
d  40

Это должно работать, если вы не знаете, какие столбцы должны совпадать из-за cols[x] inter cols[y] в начале, который получает общие столбцы между двумя таблицами , Он также работает без указания столбцов.

Хотя в этом конкретном c случае следующее будет немного быстрее:

l where not l[`c1] in r[`c1] 
...