kdb q - 对列表中的每个原子应用每个左边并减少

时间:2018-02-06 11:13:45

标签: kdb q-lang

我想在表的列和列表中的每个原子之间应用each-left。我不能使用each-both,因为表列和列表的长度不同。

我已经在某处已经看到了这一点,但我再也找不到它了。

示例:

t:([] name:("jim";"john";"john";"julia");c1: til 4);
searchNames:("jim";"john");
f:{[name;nameCol] nameCol like\:name}; / each-left between name (e.g. "jim") and column
g:f[;t[`name]];
r:g each searchNames; / result: (1000b;0110b)
filter:|/[r];     / result: 1110b
select from t where filter 

我怎样才能更像q?

2 个答案:

答案 0 :(得分:2)

如果您希望{-1}}使用每个like

/:

在这种情况下,您可以简单地使用q)select from t where any name like/:searchNames name c1 --------- "jim" 0 "john" 1 "john" 2 ,因为您没有使用任何通配符:

in

答案 1 :(得分:1)

下面是一个你可以使用的通用函数,给出两个不同大小的列表。

q)f:{(|) over x like/:y}
q)
q)select from t where f[name;searchNames]
name   c1
---------
"jim"  0
"john" 1
"john" 2

或者,将其包装在一个函数中(假设始终搜索表列):

q)f2:{x where (|) over (0!x)[y] like/:z}
q)
q)f2[t;`name;searchNames]
name   c1
---------
"jim"  0
"john" 1
"john" 2

但在你描述的场景中,托马斯的解决方案似乎是最自然的。