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

Selecting rows based on column contents which are in a list in kdb

我有一个名为 'A' 的列表:

     cont
     "aa"
     "bb"
      "cc"

我有一个名为 'run' 的 table 包含列

      first    second     third
      sad      random      "aa"
      happy    random1     "dd"

我必须 select 来自 'run' 的那些行,其中第三列包含列表 A 中的元素。我是 kdb 的新手,非常感谢任何有关如何执行此操作的帮助。谢谢

您需要关键字 in,它允许您检查一个列表中的值是否出现在另一个列表中:

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 是未加密的 table,那么您可以使用 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"

当使用 in 时,输出是一个布尔列表,计数等于左侧参数的计数(在本例中为 1 2 3):

q)1 2 3 in 2 4 6
010b

使用where clause in the select语句过滤返回的行。仅将 where 应用于布尔列表 returns 为真的索引:

q)where 1 2 3 in 2 4 6
,1

并且推而广之,table.

只会返回这些索引

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