【问题标题】:KDB how to join a list of tables to another tableKDB如何将表列表连接到另一个表
【发布时间】:2021-06-21 10:13:31
【问题描述】:

给定表a:

a:([] sym:`a`b`c; qty: 1 2 3)

和表t列表:

t:(([] sym:`a`b`c; qty:1 2 3; price: 1.1 2.2 3.3); ([] sym:`a`b`c; qty:3 4 5; length:100 200 300))

期望的结果:

sym qty price length
a 1 1.1 100
b 2 1.2 200
c 3 3.3 300

如何将 t 的某些元素加入到表 a 中?

由于 t 是一个表列表,我们如何将这个列表分解/转换成一个更“便于检索”的表?

【问题讨论】:

  • 你能和我们分享你想要的输出吗?要将t 中的一个表或所有表连接到a 吗?
  • 添加了所需的输出,谢谢!

标签: kdb


【解决方案1】:

按照您想要的方式加入表格似乎最简单的方法是通过symlj 将每个表格键入a

我们可以像这样通过sym 对每个表进行键控:

q)1!'t
(+(,`sym)!,`a`b`c)!+`qty`price!(1 2 3;1.1 2.2 3.3)
(+(,`sym)!,`a`b`c)!+`qty`length!(3 4 5;100 200 300)

lj 会将右侧表格中的字段和值连接到左侧表格中,以获得匹配的键。下面使用/ (over) 确保从第一个lj 的返回用于第二个lj (两个左连接,因为有两个表要连接)。

q)lj/[a;reverse 1!'t]
sym qty length price
--------------------
a   1   100    1.1
b   2   200    2.2
c   3   300    3.3

我使用reverse 来确保第一个表最后加入,以便qty 匹配您想要的输出。

如果字段的顺序很重要,您可以使用xcols

q)`sym`qty`price xcols lj/[a;reverse 1!'t]
sym qty price length
--------------------
a   1   1.1   100
b   2   2.2   200
c   3   3.3   300

【讨论】:

  • 非常感谢您的帮助!当我尝试将第一列设置为键(1!`t)时,我得到了这个:(([] sym)!kx.c$Flip@6ab657fe;([] sym)!kx.c$Flip@746de55a)我有语法错误吗?它似乎不想键入 sym 列
  • 我认为这里的问题是您使用反引号 ` 而不是撇号 (') 来表示 1!'t
  • 我认为您只是在这种形式中看到它,因为您是在 qStudio(或其他一些 IDE)中查看它。这就是 qStudio 表示键控表列表的方式。切换到“控制台”视图以获取替代视图。无论哪种方式,底层的 kdb 对象都符合 Cathals
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2018-01-13
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多