KDB/Q: 无法在 KDB 中创建存储列表的列 table

KDB/Q: Cannot create a column storing lists in a KDB table

我是 KDB 和 Q 的新手

我在 Q For Mortals 中阅读了以下内容并推断出 KDB 支持复合列。

The case of a nested column in which all items are simple lists of the same type is handled specially in kdb+. We call this a compound column. There is no requirement that the simple lists all have the same length.

我知道可以在 table 中创建一个新列,如下所示:tablename: update newcol:value from tablename

当我将值设置为另一列或使用其他列或常量值进行某些计算时,它工作正常,并且在 table 中创建了一个新列,并适当地设置了值。但是,当我尝试将值设置为列表时,它不起作用:tablename: update newcol: (1 2) from tablename 给出“长度”错误。

我浏览了 Q For Mortals 中的文档,但无法弄清楚如何创建这样的复合列。请帮我创建一个存储列表的列。谢谢!

没有看到示例,这可能是因为 q 试图使用 1 2 作为 newcol 的值,而 newcol 的长度与 table 的长度不同。要强制列表本身作为 table 中的每个条目,您需要有适当数量的值。您可以使用虚拟列 ienlist.

来实现此目的
q)tab:([]time:5#.z.d;col1:1 2 3 4 5)
q)tab
time       col1
---------------
2020.07.17 1
2020.07.17 2
2020.07.17 3
2020.07.17 4
2020.07.17 5
q)update col2:1 2 from tab
'length
q)show tab:update col2:count[i]#enlist 1 2 from tab
time       col1 col2
--------------------
2020.07.17 1    1 2
2020.07.17 2    1 2
2020.07.17 3    1 2
2020.07.17 4    1 2
2020.07.17 5    1 2
q)meta tab
c   | t f a
----| -----
time| d
col1| j
col2| J

table 的 meta 包含 col2 的大写 J,表示每个条目都是多头列表。

以《Q For Mortals》为例:

q)tm:([] wk:2015.01.01 2015.01.08; rv:(38.92 67.34; 16.99 5.14 128.23 31.69))

我们可以向其中添加另一个新的复合列,如下所示:

q)update newcol:(1 2;3 4 5) from tm
wk         rv                      newcol
-----------------------------------------
2015.01.01 38.92 67.34             1 2
2015.01.08 16.99 5.14 128.23 31.69 3 4 5

请注意,如果添加不同数量的行,例如由于不匹配,我们会收到长度错误,例如在下面添加三行(或列表)

q)update newcol:(1 2;3 4 5;6 7 8) from tm
'length
  [0]  update newcol:(1 2;3 4 5;6 7 8) from tm

给定一些 table

q)show tab:([]a:10?`AAA`BBB`CCC;b:10?10000);
a   b
--------
CCC 627
CCC 2685
BBB 1518
BBB 725
CCC 1369
CCC 663
BBB 9478
BBB 1588
AAA 8660
CCC 3780

如果要添加常量复合列,例如1 2,您需要先将此向量扩展到table

的长度
q)count[tab]#enlist 1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
q)update c:count[tab]#enlist 1 2 from tab
a   b    c
------------
CCC 627  1 2
CCC 2685 1 2
BBB 1518 1 2
BBB 725  1 2
CCC 1369 1 2
CCC 663  1 2
BBB 9478 1 2
BBB 1588 1 2
AAA 8660 1 2
CCC 3780 1 2

生成复合列的其他常见方式是将符号字段更新为字符串

q)update string a from tab
a     b
----------
"CCC" 627
"CCC" 2685
"BBB" 1518
"BBB" 725
"CCC" 1369
"CCC" 663
"BBB" 9478
"BBB" 1588
"AAA" 8660
"CCC" 3780

或者在执行带有 by 子句但没有聚合的查询时

q)select b by a from tab
a  | b
---| ----------------------
AAA| ,8660
BBB| 1518 725 9478 1588
CCC| 627 2685 1369 663 3780