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 中的每个条目,您需要有适当数量的值。您可以使用虚拟列 i
和 enlist
.
来实现此目的
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
我是 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 中的每个条目,您需要有适当数量的值。您可以使用虚拟列 i
和 enlist
.
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