kdb:动态反规范化 table(将键值转换为列名)
kdb: dynamically denormalize a table (convert key values to column names)
我有一个 table 这样的:
q)t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);server:(`S01`S02`S01`S02)];volume:(20;10;30;50))
q)t
sym server| volume
-------------| ------
EURUSD S01 | 20
EURUSD S02 | 10
AUDUSD S01 | 30
AUDUSD S02 | 50
我需要对其进行反规范化以更好地显示数据。结果 table 应如下所示:
sym | S01 S02
------| -------
EURUSD| 20 10
AUDUSD| 30 50
如何使用来自服务器列的不同值作为新 table 的列名称动态转换原始 table?
谢谢!
基本上你想要'pivot'table。以下页面对您的问题有很好的解决方案:
http://code.kx.com/q/cookbook/pivoting-tables/
以下是获取所需 table:
的命令
q) P:asc exec distinct server from t
q) exec P#(server!volume) by sym:sym from t
旋转 table 的一个棘手问题是——字典的键应该是 type
symbol
否则它不会生成旋转 table 结构.
例如在下面的 table 中,我们有一列 dt
,其中 type
为 date
。
t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);dt:(0 1 0 1+.z.d)];volume:(20;10;30;50))
现在,如果我们想用列作为日期来旋转它,它将生成如下结构:
q)P:asc exec distinct dt from t
q)exec P#(dt!volume) by sym:sym from t
(`s#flip (enlist `sym)!enlist `s#`AUDUSD`EURUSD)!((`s#2018.06.22 2018.06.23)!30j, 50j;(`s#2018.06.22 2018.06.23)!20j, 10j)
要将日期作为列,必须将 dt
列类型转换为 symbol
:
show P:asc exec distinct `$string date from t
`s#`2018.06.22`2018.06.23
q)exec P#((`$string date)!volume) by sym:sym from t
sym | 2018.06.22 2018.06.23
------| ---------------------
AUDUSD| 30 50
EURUSD| 20 10
我有一个 table 这样的:
q)t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);server:(`S01`S02`S01`S02)];volume:(20;10;30;50))
q)t
sym server| volume
-------------| ------
EURUSD S01 | 20
EURUSD S02 | 10
AUDUSD S01 | 30
AUDUSD S02 | 50
我需要对其进行反规范化以更好地显示数据。结果 table 应如下所示:
sym | S01 S02
------| -------
EURUSD| 20 10
AUDUSD| 30 50
如何使用来自服务器列的不同值作为新 table 的列名称动态转换原始 table?
谢谢!
基本上你想要'pivot'table。以下页面对您的问题有很好的解决方案: http://code.kx.com/q/cookbook/pivoting-tables/
以下是获取所需 table:
的命令 q) P:asc exec distinct server from t
q) exec P#(server!volume) by sym:sym from t
旋转 table 的一个棘手问题是——字典的键应该是 type
symbol
否则它不会生成旋转 table 结构.
例如在下面的 table 中,我们有一列 dt
,其中 type
为 date
。
t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);dt:(0 1 0 1+.z.d)];volume:(20;10;30;50))
现在,如果我们想用列作为日期来旋转它,它将生成如下结构:
q)P:asc exec distinct dt from t
q)exec P#(dt!volume) by sym:sym from t
(`s#flip (enlist `sym)!enlist `s#`AUDUSD`EURUSD)!((`s#2018.06.22 2018.06.23)!30j, 50j;(`s#2018.06.22 2018.06.23)!20j, 10j)
要将日期作为列,必须将 dt
列类型转换为 symbol
:
show P:asc exec distinct `$string date from t
`s#`2018.06.22`2018.06.23
q)exec P#((`$string date)!volume) by sym:sym from t
sym | 2018.06.22 2018.06.23
------| ---------------------
AUDUSD| 30 50
EURUSD| 20 10