根据kdb中列表中的列内容选择行

根据kdb中列表中的列内容选择行,kdb,q-lang,Kdb,Q Lang,我有一个名为“a”的列表: cont "aa" "bb" "cc" 我有一个名为“run”的表,其中包含列 first second third sad random "aa" happy random1 "dd" 我必须从“run”中选择那些行,其中第三列包含列表A中的元素。我对kdb非常陌生,非常感谢您提供的任何帮助。谢谢您需要一个关键字,用于检查一个列表中的值是

我有一个名为“a”的列表:

     cont
     "aa"
     "bb"
      "cc"
我有一个名为“run”的表,其中包含列

      first    second     third
      sad      random      "aa"
      happy    random1     "dd"
我必须从“run”中选择那些行,其中第三列包含列表A中的元素。我对kdb非常陌生,非常感谢您提供的任何帮助。谢谢

您需要一个关键字,用于检查一个列表中的值是否出现在另一个列表中:

q)show A:("aa";"bb";"cc")
"aa"
"bb"
"cc"
q)show run:([]f:("sad";"happy");s:("random";"random1");t:("aa";"dd"))
f       s         t
----------------------
"sad"   "random"  "aa"
"happy" "random1" "dd"
q)select from run where t in A
f     s        t
-------------------
"sad" "random" "aa"
如果
A
是一个未检查的表,则可以使用
A`cont
将列
cont
拉出:

q)show A:([]cont:("aa";"bb";"cc"))
cont
----
"aa"
"bb"
"cc"
q)select from run where t in A`cont
f     s        t
-------------------
"sad" "random" "aa"
在中使用
时,输出是一个布尔列表,其计数等于左侧参数的计数(在本例中为
1 2 3
):

在语句中使用子句将筛选返回的行。将
where
应用于布尔列表仅返回其为真的索引:

q)where 1 2 3 in 2 4 6
,1
通过扩展,表中只返回这些索引


还应该注意的是,尽管您提供的表只是一个示例,但它包含关键字作为列标题。如果可能,应避免使用关键字作为标题,因为它们会导致意外行为。

我使用“in”(长度不兼容(同步操作的不同操作数长度或表列长度不相同)得到以下错误表“A”也有一些标题名。错误是由此引起的吗?添加了一个示例,说明如果
A
是一个表,则需要从中提取列
cont
。此外,
的参数顺序很重要,表中的列应该是第一个参数(
third
)比较列表应该是第二个(
A
)。我使用从另一个表中选择列生成了A。此外,第三列的类型为C。更新后的方法应该可以工作,使用
select
上述变量
A
是一个表。您可以使用
exec col from tab
而不是
select
返回列表而不是表。
q)where 1 2 3 in 2 4 6
,1