kdb q - 对列表中的每个原子应用 each-left 并减少
kdb q - apply each-left for each atom in list and reduce
我想在 table 的列和列表中的每个原子之间应用 each-left
。我不能使用 each-both
因为 table 列和列表的长度不同。
我已经在某处的一行中看到了这一点,但我再也找不到了..
示例:
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?
如果您希望将 like
与每个权利一起使用 /:
:
q)select from t where any name like/:searchNames
name c1
---------
"jim" 0
"john" 1
"john" 2
在这种情况下,您可以简单地使用 in
,因为您没有使用任何通配符:
q)select from t where name in searchNames
name c1
---------
"jim" 0
"john" 1
"john" 2
给定两个不同大小的列表,下面是您可以使用的通用函数。
q)f:{(|) over x like/:y}
q)
q)select from t where f[name;searchNames]
name c1
---------
"jim" 0
"john" 1
"john" 2
或者,将其包装在一个函数中(假设始终搜索 table 列):
q)f2:{x where (|) over (0!x)[y] like/:z}
q)
q)f2[t;`name;searchNames]
name c1
---------
"jim" 0
"john" 1
"john" 2
但在您描述的场景中,Thomas 的解决方案似乎是最自然的。
我想在 table 的列和列表中的每个原子之间应用 each-left
。我不能使用 each-both
因为 table 列和列表的长度不同。
我已经在某处的一行中看到了这一点,但我再也找不到了..
示例:
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?
如果您希望将 like
与每个权利一起使用 /:
:
q)select from t where any name like/:searchNames
name c1
---------
"jim" 0
"john" 1
"john" 2
在这种情况下,您可以简单地使用 in
,因为您没有使用任何通配符:
q)select from t where name in searchNames
name c1
---------
"jim" 0
"john" 1
"john" 2
给定两个不同大小的列表,下面是您可以使用的通用函数。
q)f:{(|) over x like/:y}
q)
q)select from t where f[name;searchNames]
name c1
---------
"jim" 0
"john" 1
"john" 2
或者,将其包装在一个函数中(假设始终搜索 table 列):
q)f2:{x where (|) over (0!x)[y] like/:z}
q)
q)f2[t;`name;searchNames]
name c1
---------
"jim" 0
"john" 1
"john" 2
但在您描述的场景中,Thomas 的解决方案似乎是最自然的。