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,其中 typedate

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